如何正确读取 Android 上的 AsyncStorage
How to Read AsyncStorage on Android Correctly
似乎可以从 Android(本机)访问 AsyncStorage
;但我仍在努力完成这项工作。
在我的 React Native 应用程序中,我有类似的东西:
商店
const config = {
...
}
export const reducers = {
...
user: user
}
let rootReducer = combineReducers(reducers)
let reducer = persistReducer(config, rootReducer)
用户减速器
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
有些问题没有解决
- Access AsyncStorage from native code
- Can I access data stored in React Native's AsyncStorage from java layer?
- React Native: How to use Java code to fetch data via React Native async storage
AsyncStorage
它是一个独特的 JSON 对象,而我期望有很多行 key
和 value
;这就是我得到空值的原因。
所以我首先继续查询
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 "";
}
}
}
调用class
AsyncStorage as = new AsyncStorage(context);
as.getFullname()
我的应用程序中的闹钟有问题,我决定在 Android 端使用 AsyncStorage,然后我使用下面的代码,我可以从 AsyncStorage 获取所有值并生成所有已注册的警报在我的应用程序的 AsyncStorage 中。
SQLiteDatabase readableDatabase = null;
readableDatabase = ReactDatabaseSupplier.getInstance(this.reactContext).getReadableDatabase();
Cursor catalystLocalStorage = readableDatabase.query("catalystLocalStorage", null, null, null, null, null, null);
try {
List<AlarmeDTO> listaAlarmes = new ArrayList<>();
if (catalystLocalStorage.moveToFirst()) {
do {
//Ex: key: 01082019_0800
//value: [{executionDate: 2019-08-01T08:00}]
String key = catalystLocalStorage.getString(0);
String json = catalystLocalStorage.getString(1);
if (dados.length == 3) {
...generate my alarms with key and json
}
} while (catalystLocalStorage.moveToNext());
}//2_31082019_0900 - [{"idPrescricaoMedicamento":35,"nomeMedicamento":"VITAMINA"}]
} finally {
if (catalystLocalStorage != null) {
catalystLocalStorage.close();
}
if (readableDatabase != null) {
readableDatabase.close();
}
}
似乎可以从 Android(本机)访问 AsyncStorage
;但我仍在努力完成这项工作。
在我的 React Native 应用程序中,我有类似的东西:
商店
const config = {
...
}
export const reducers = {
...
user: user
}
let rootReducer = combineReducers(reducers)
let reducer = persistReducer(config, rootReducer)
用户减速器
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
有些问题没有解决
- Access AsyncStorage from native code
- Can I access data stored in React Native's AsyncStorage from java layer?
- React Native: How to use Java code to fetch data via React Native async storage
AsyncStorage
它是一个独特的 JSON 对象,而我期望有很多行 key
和 value
;这就是我得到空值的原因。
所以我首先继续查询
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 "";
}
}
}
调用class
AsyncStorage as = new AsyncStorage(context);
as.getFullname()
我的应用程序中的闹钟有问题,我决定在 Android 端使用 AsyncStorage,然后我使用下面的代码,我可以从 AsyncStorage 获取所有值并生成所有已注册的警报在我的应用程序的 AsyncStorage 中。
SQLiteDatabase readableDatabase = null;
readableDatabase = ReactDatabaseSupplier.getInstance(this.reactContext).getReadableDatabase();
Cursor catalystLocalStorage = readableDatabase.query("catalystLocalStorage", null, null, null, null, null, null);
try {
List<AlarmeDTO> listaAlarmes = new ArrayList<>();
if (catalystLocalStorage.moveToFirst()) {
do {
//Ex: key: 01082019_0800
//value: [{executionDate: 2019-08-01T08:00}]
String key = catalystLocalStorage.getString(0);
String json = catalystLocalStorage.getString(1);
if (dados.length == 3) {
...generate my alarms with key and json
}
} while (catalystLocalStorage.moveToNext());
}//2_31082019_0900 - [{"idPrescricaoMedicamento":35,"nomeMedicamento":"VITAMINA"}]
} finally {
if (catalystLocalStorage != null) {
catalystLocalStorage.close();
}
if (readableDatabase != null) {
readableDatabase.close();
}
}