android - Android上如何正确读取AsyncStorage

标签 android react-native redux asyncstorage redux-persist

似乎可以从 Android( native )访问 AsyncStorage;但我仍在努力完成这项工作。

在我的 React Native 应用程序中,我有类似的东西:

商店

const config = {
  ...
}

export const reducers = {
  ...
  user: user
}


let rootReducer = combineReducers(reducers)
let reducer = persistReducer(config, rootReducer)

用户 reducer

export class Actions {
    ...
}

const initialState = {
      first_name: : null,
      last_name: : null,
      email: null,
      addresses: [
          { ... }
      ]
    }
  }
}

export const reducer = (state = initialState, action) => {
  switch (action.type) {
    ...
  }
}

从商店获取用户

const user = store.getState().user
console.log(user.first_name) // Steve
...

现在,当我尝试从 Android 获取同一个用户时,问题就开始了,在我所有受挫的尝试中,这就是我所拥有的:

try {
    readableDatabase = ReactDatabaseSupplier.getInstance(getReactApplicationContext()).getReadableDatabase();
    catalystLocalStorage = readableDatabase.query("catalystLocalStorage", new String[]{"value"}, "key = ?", new String[] { "full_name" }, null, null, null);
    String[] names = catalystLocalStorage.getColumnNames();
    if (catalystLocalStorage.moveToFirst()) {
        final String value = catalystLocalStorage.getString(catalystLocalStorage.getColumnIndex("value"));
        Log.d(TAG, value);
    }
} finally {
    if (catalystLocalStorage != null) {
        catalystLocalStorage.close();
    }

    if (readableDatabase != null) {
        readableDatabase.close();
    }
}

由于 User 是一个对象,我不知道这是否是获取 'first_name' 的正确方法,我尝试获取 'user' 但没有'成功了。

我开始认为我应该使用 react-native-sqlite-storage我知道我的数据结构在哪里,但我不知道我是否能够在 Android 上访问该数据库。

PS:我想访问 AsyncStorage 而不是 SharedPreferences


库版本

react-native: 0.48.4
redux: 3.7.2
redux-persist: 5.4.0

一些没有解决的问题

最佳答案

AsyncStorage 它是一个独特的 JSON 对象,而我期待的是多行 keyvalue;这就是我得到空值的原因。

所以首先我继续查询

catalystLocalStorage = readableDatabase.query("catalystLocalStorage", new String[]{"key", "value"}, null, null, null, null, null);

然后我检查以避免空指针

if (catalystLocalStorage.moveToFirst()) {

然后我进行抓取

do {
    // JSONObject will ask for try catch
    JSONObject obj = new JSONObject(catalystLocalStorage.getString(catalystLocalStorage.getColumnIndex("value")));
} while(catalystLocalStorage.moveToNext());

我确信可能有更好的方法来做到这一点,但我知道我对此没有意见。

如果你有更好的想法欢迎留下你的想法。

更新

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.modules.storage.ReactDatabaseSupplier;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;

public class AsyncStorage {

    public static String TAG = "RNAsyncStorage";
    public ReactApplicationContext context;
    public ArrayList<JSONObject> collection;
    public JSONObject data;
    public JSONObject user;

    Cursor catalystLocalStorage = null;
    SQLiteDatabase readableDatabase = null;

    public AsyncStorage (ReactApplicationContext context) {
        this.context = context;
        this.collection = new ArrayList<JSONObject>();
        this.fetch();
        this.setUser();
    }

    public void fetch() {
        try {
            readableDatabase = ReactDatabaseSupplier.getInstance(context).getReadableDatabase();
            catalystLocalStorage = readableDatabase.query("catalystLocalStorage", new String[]{"key", "value"}, null, null, null, null, null);

            if (catalystLocalStorage.moveToFirst()) {
                do {
                    try {
                        // one row with all AsyncStorage: { "user": { ... }, ... }
                        String json = catalystLocalStorage.getString(catalystLocalStorage.getColumnIndex("value"));
                        JSONObject obj = new JSONObject(json);

                        String user = obj.getString("user");

                        JSONObject res = new JSONObject();
                        res.put("user", new JSONObject(user));

                        collection.add(res);
                    } catch(Exception e) {
                        // do something
                    }
                } while(catalystLocalStorage.moveToNext());
            }
        } finally {
            if (catalystLocalStorage != null) {
                catalystLocalStorage.close();
            }

            if (readableDatabase != null) {
                readableDatabase.close();
            }

            data = this.collection.get(0);
        }
    }

    public String getFullname () {
        try {
            return user.getString("fullname");
        } catch (Exception e) {
            return "";
        }
    }
}

调用类

AsyncStorage as = new AsyncStorage(context);
as.getFullname()

关于android - Android上如何正确读取AsyncStorage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48151030/

相关文章:

android - obj Fragment 错误的第二个参数类型找到 'Android.support.V4.app.Fragment.' 需要 'Android.app.Fragment'

android - react-native run-android 找不到 com.android.tools.build :gradle:3. 0.1

react-native - React Native fb-sdk 找不到符号 CallbackManager

reactjs - Redux:如何将父属性传递到 reducer 的初始状态?

javascript - Webpack-dev-server、redux、同构 React 路由器不变错误

android - 单击按钮后应用程序崩溃(包括 logcat)

android - 如何在 zxing 中触发批量模式扫描

javascript - React Native - 当应用程序进入前台时渲染

javascript - Redux-Thunk Chaining Actions,得到一个“dispatch(...) then is not a function error

java - 在 RecyclerView 或分组 Recyclerview 项目中按组划分元素,按日期说