【问题标题】:Can I access data stored in React Native's AsyncStorage from java layer?我可以从 java 层访问存储在 React Native 的 AsyncStorage 中的数据吗?
【发布时间】:2016-09-06 23:42:12
【问题描述】:

我使用AsyncStorage 在 React Native 中存储了一些用户偏好。现在,我需要从后台服务中获取这些偏好。我无法从 Java 层访问AsyncStorage。有办法吗?

在iOS中,我们可以导入RCTAsyncLocalStorage.h并调用_getValueForKey。但是,我找不到在 Android 中执行此操作的方法。

【问题讨论】:

    标签: java android react-native


    【解决方案1】:

    是的,你可以。 反应原生 您需要在返回值的 React Native 中创建方法。 本国的 使用 facebook 提供的 PackagesModule 类从 Native 访问 React-native 方法 使用它可以访问 AsyncStorage

    Android Native Modules

    【讨论】:

      【解决方案2】:

      使用 react-native-default-preference。它比 react-native-shared-preferences 更好。

      【讨论】:

        【解决方案3】:

        我有以下代码可以完成这项工作。

        import com.facebook.react.modules.storage.AsyncLocalStorageUtil;
        import com.facebook.react.modules.storage.ReactDatabaseSupplier;
        import android.database.sqlite.SQLiteDatabase;
        .....
        .....
        
        
        SQLiteDatabase readableDatabase = null;
        readableDatabase = ReactDatabaseSupplier.getInstance(this.getApplicationContext()).getReadableDatabase();
         if (readableDatabase != null) {
            String impl = AsyncLocalStorageUtil.getItemImpl(readableDatabase, "myTableName");
            Log.d(TAG, "impl: " + impl);
          }
        
        ====================
        and to delete the DB
        =====================
        SQLiteDatabase database = ReactDatabaseSupplier.getInstance(getContext()).getWritableDatabase();
        database.delete(CATALYST_LOCAL_STORAGE, null, null);
        

        【讨论】:

        • 我用的是redux-persist,你知道我怎么知道myTableName的名字
        • @Pablo 我知道这是一篇旧帖子。但是如果有人需要使用此方法读取 redux-persist 数据库,则数据库名称为“catalystLocalStorage”,密钥为“persist:root”,假设在配置 redux-persist 时将密钥名称指定为 root。
        • @MuhammadRiyaz,感谢您发布此信息。有什么方法可以清除数据库或值吗?
        • @AmoghJahagirdar 抱歉回复晚了。查看我使用导入更新的答案。
        • @AmoghJahagirdar 我使用了相同的名称,但它说没有找到具有该名称的表。但我能够读取具有相同表名的数据库。所以我这样ReactDatabaseSupplier readableDatabase = ReactDatabaseSupplier.getInstance(context); readableDatabase.clearAndCloseDatabase();
        【解决方案4】:

        我的解决方案是直接使用 ReactDatabaseSupplier 类(我的应用程序不使用 Rocksdb 所以我可以确定 SQLite DB 始终用作存储(而且,我猜它总是更喜欢 SQLite本地存储上的数据库))

        该数据库是一个简单的键值数据库(两列,keyvalue),表名为“catalystLocalStorage”(您可以尝试读取ReactDatabaseSupplier#TABLE_NAME,但它是受保护的,您可以尝试使用反思,但我不确定这些麻烦是否值得)

        Cursor catalystLocalStorage = null;
        SQLiteDatabase readableDatabase = null;
        
        try {
          readableDatabase = ReactDatabaseSupplier.getInstance(this.getApplicationContext()).getReadableDatabase();
          catalystLocalStorage = readableDatabase.query("catalystLocalStorage", new String[]{"value"}, "key = ?", new String[] { "keyName" }, null, null, null);
          final String value = catalystLocalStorage.getString(catalystLocalStorage.getColumnIndex("value"));
          [...]
        } finally { 
          if (catalystLocalStorage != null) {
            catalystLocalStorage.close();
          }
        
          if (readableDatabase != null) {
            readableDatabase.close();
          }
        }
        

        它对我有用,但不确定它是否能经得起未来的考验

        【讨论】:

          【解决方案5】:

          我尝试使用 java 层的AsyncStorage。但是,我做不到。所以,我构建了一个 React Native 插件来从 javascript 层访问 Android 的 Native SharedPreferences。我已经在github上发布了(https://github.com/sriraman/react-native-shared-preferences

          现在我正在使用来自JavaReact Native 层的SharedPreferences

          【讨论】:

            猜你喜欢
            • 2010-11-26
            • 2016-11-22
            • 2017-09-01
            • 2018-04-16
            • 2016-06-06
            • 2017-02-01
            • 2023-04-05
            • 1970-01-01
            • 2022-03-18
            相关资源
            最近更新 更多