React Native AsyncStorage 存储字符串以外的值
React Native AsyncStorage storing values other than strings
有没有办法用 AsyncStorage 存储字符串以外的值?例如,我想存储简单的布尔值。
AsyncStorage.setItem('key', 'ok');
没问题,但是:
AsyncStorage.setItem('key', false);
不起作用..
基于AsyncStorage React-native docs,恐怕你只能存储字符串..
static setItem(key: string, value: string, callback?: ?(error: ?Error)
> => void)
Sets value for key and calls callback on completion, along with an
Error if there is any. Returns a Promise object.
您可能想尝试看看第三方软件包。也许 this one.
编辑 2016 年 2 月 11 日
感谢@Stinodes 的技巧。
虽然只能存储字符串,但也可以将对象和数组用JSON字符串化来存储,取出后再解析
这仅适用于普通对象实例或数组,但是,从任何原型继承的对象可能会导致意外问题。
一个例子:
// Saves to storage as a JSON-string
AsyncStorage.setItem('key', JSON.stringify(false))
// Retrieves from storage as boolean
AsyncStorage.getItem('key', (err, value) => {
if (err) {
console.log(err)
} else {
JSON.parse(value) // boolean false
}
})
您只能存储字符串,但您可以使用 JSON 完全将对象和数组字符串化,并在将它们从本地存储中拉出时再次解析它们。
不过,这仅适用于普通 Object
-实例或数组。
从任何原型继承的对象可能会导致一些意外行为,因为原型不会被解析为 JSON。
不过,可以使用 JSON.stringify
存储布尔值(或与此相关的任何原语)。
JSON 识别这些类型,并且可以两种方式解析它们。
JSON.stringify(false) // "false"
JSON.parse("false") // false
所以:
// Saves to storage as a JSON-string
AsyncStorage.setItem('someBoolean', JSON.stringify(false))
// Retrieves from storage as boolean
AsyncStorage.getItem('someBoolean', function (err, value) {
JSON.parse(value) // boolean false
}
// Or if you prefer using Promises
AsyncStorage.getItem('someBoolean')
.then( function (value) {
JSON.parse(value) // boolean false
})
// Or if you prefer using the await syntax
JSON.parse(await AsyncStorage.getItem('someBoolean')) // boolean false
获取并解析值(不一定是boolean,也可以是object,满足你的需求),你就可以进入state或者做任何事情了。
我在 AsyncStorage
的 "name" 键中设置了值
AsyncStorage.setItem("name", "Hello");
从键中获取值 "name"
AsyncStorage.getItem("name").then((value) => {
console.log("Get Value >> ", value);
}).done();
Output will be as follows:
'Get Values >> ', 'Hello'
await AsyncStorage.setItem('saveUserCredential', JSON.stringify(true/false), () => {
console.log("saveUserCredential save details " +flag);
});
AsyncStorage.getItem('saveUserCredential').then(async (value) => {
let userLogin = await JSON.parse(value);
if(userLogin ){
this.props.navigation.navigate("HomeScreen");
}else {
this.props.navigation.navigate("LoginScreen");
}
});
我总是 use/create 围绕 AsyncStorage 的包装模块,利用 JSON.parse 和 JSON.stringify 处理进出数据。
这样您就无需在业务逻辑中调用 JSON.parse 和 JSON.stringify。这使代码看起来更美观。
类似
import AsyncStorage from "@react-native-community/async-storage";
export const Storage {
getItem: async (key) => {
try {
let result = await AsyncStorage.getItem(key);
return JSON.parse(result);
}
catch (e) {
throw e;
}
},
setItem: async (key, value) => {
try {
const item = JSON.stringify(value);
return await AsyncStorage.setItem(key, item);
} catch (e) {
throw e;
}
}
}
// usage
async function usage () {
const isLeeCool = true;
const someObject = { name: "Dave" };
const someArray = ["Lee", "Is", "Cool."];
try {
// Note Async storage has a method where you can set multiple values,
// that'd be a better bet here (adding it to the wrapper).
await Storage.setItem("leeIsCool", leeIsCool);
await Storage.setItem("someObject", someObject);
await Storage.setItem("someArray", someArray);
} catch (e) {}
// Some point later that day...
try {
console.log(await Storage.getItem("leeIsCool"));
console.log(await Storage.getItem("someObject"));
console.log(await Storage.getItem("someArray"));
} catch (e) {}
}
我建议你使用react-native-easy-app,通过它你可以同步访问AsyncStorage,也可以存储和检索对象、字符串或布尔数据。
import { XStorage } from 'react-native-easy-app';
import { AsyncStorage } from 'react-native';
export const RNStorage = {// RNStorage : custom data store object
token: undefined, // string type
isShow: undefined, // bool type
userInfo: undefined, // object type
};
const initCallback = () => {
// From now on, you can write or read the variables in RNStorage synchronously
// equal to [console.log(await AsyncStorage.getItem('isShow'))]
console.log(RNStorage.isShow);
// equal to [ await AsyncStorage.setItem('token',TOKEN1343DN23IDD3PJ2DBF3==') ]
RNStorage.token = 'TOKEN1343DN23IDD3PJ2DBF3==';
// equal to [ await AsyncStorage.setItem('userInfo',JSON.stringify({ name:'rufeng', age:30})) ]
RNStorage.userInfo = {name: 'rufeng', age: 30};
};
XStorage.initStorage(RNStorage, AsyncStorage, initCallback);
有没有办法用 AsyncStorage 存储字符串以外的值?例如,我想存储简单的布尔值。
AsyncStorage.setItem('key', 'ok');
没问题,但是:
AsyncStorage.setItem('key', false);
不起作用..
基于AsyncStorage React-native docs,恐怕你只能存储字符串..
static setItem(key: string, value: string, callback?: ?(error: ?Error)
> => void)
Sets value for key and calls callback on completion, along with an Error if there is any. Returns a Promise object.
您可能想尝试看看第三方软件包。也许 this one.
编辑 2016 年 2 月 11 日
感谢@Stinodes 的技巧。
虽然只能存储字符串,但也可以将对象和数组用JSON字符串化来存储,取出后再解析
这仅适用于普通对象实例或数组,但是,从任何原型继承的对象可能会导致意外问题。
一个例子:
// Saves to storage as a JSON-string
AsyncStorage.setItem('key', JSON.stringify(false))
// Retrieves from storage as boolean
AsyncStorage.getItem('key', (err, value) => {
if (err) {
console.log(err)
} else {
JSON.parse(value) // boolean false
}
})
您只能存储字符串,但您可以使用 JSON 完全将对象和数组字符串化,并在将它们从本地存储中拉出时再次解析它们。
不过,这仅适用于普通 Object
-实例或数组。
从任何原型继承的对象可能会导致一些意外行为,因为原型不会被解析为 JSON。
不过,可以使用 JSON.stringify
存储布尔值(或与此相关的任何原语)。
JSON 识别这些类型,并且可以两种方式解析它们。
JSON.stringify(false) // "false"
JSON.parse("false") // false
所以:
// Saves to storage as a JSON-string
AsyncStorage.setItem('someBoolean', JSON.stringify(false))
// Retrieves from storage as boolean
AsyncStorage.getItem('someBoolean', function (err, value) {
JSON.parse(value) // boolean false
}
// Or if you prefer using Promises
AsyncStorage.getItem('someBoolean')
.then( function (value) {
JSON.parse(value) // boolean false
})
// Or if you prefer using the await syntax
JSON.parse(await AsyncStorage.getItem('someBoolean')) // boolean false
获取并解析值(不一定是boolean,也可以是object,满足你的需求),你就可以进入state或者做任何事情了。
我在 AsyncStorage
的 "name" 键中设置了值AsyncStorage.setItem("name", "Hello");
从键中获取值 "name"
AsyncStorage.getItem("name").then((value) => {
console.log("Get Value >> ", value);
}).done();
Output will be as follows:
'Get Values >> ', 'Hello'
await AsyncStorage.setItem('saveUserCredential', JSON.stringify(true/false), () => {
console.log("saveUserCredential save details " +flag);
});
AsyncStorage.getItem('saveUserCredential').then(async (value) => {
let userLogin = await JSON.parse(value);
if(userLogin ){
this.props.navigation.navigate("HomeScreen");
}else {
this.props.navigation.navigate("LoginScreen");
}
});
我总是 use/create 围绕 AsyncStorage 的包装模块,利用 JSON.parse 和 JSON.stringify 处理进出数据。
这样您就无需在业务逻辑中调用 JSON.parse 和 JSON.stringify。这使代码看起来更美观。
类似
import AsyncStorage from "@react-native-community/async-storage";
export const Storage {
getItem: async (key) => {
try {
let result = await AsyncStorage.getItem(key);
return JSON.parse(result);
}
catch (e) {
throw e;
}
},
setItem: async (key, value) => {
try {
const item = JSON.stringify(value);
return await AsyncStorage.setItem(key, item);
} catch (e) {
throw e;
}
}
}
// usage
async function usage () {
const isLeeCool = true;
const someObject = { name: "Dave" };
const someArray = ["Lee", "Is", "Cool."];
try {
// Note Async storage has a method where you can set multiple values,
// that'd be a better bet here (adding it to the wrapper).
await Storage.setItem("leeIsCool", leeIsCool);
await Storage.setItem("someObject", someObject);
await Storage.setItem("someArray", someArray);
} catch (e) {}
// Some point later that day...
try {
console.log(await Storage.getItem("leeIsCool"));
console.log(await Storage.getItem("someObject"));
console.log(await Storage.getItem("someArray"));
} catch (e) {}
}
我建议你使用react-native-easy-app,通过它你可以同步访问AsyncStorage,也可以存储和检索对象、字符串或布尔数据。
import { XStorage } from 'react-native-easy-app';
import { AsyncStorage } from 'react-native';
export const RNStorage = {// RNStorage : custom data store object
token: undefined, // string type
isShow: undefined, // bool type
userInfo: undefined, // object type
};
const initCallback = () => {
// From now on, you can write or read the variables in RNStorage synchronously
// equal to [console.log(await AsyncStorage.getItem('isShow'))]
console.log(RNStorage.isShow);
// equal to [ await AsyncStorage.setItem('token',TOKEN1343DN23IDD3PJ2DBF3==') ]
RNStorage.token = 'TOKEN1343DN23IDD3PJ2DBF3==';
// equal to [ await AsyncStorage.setItem('userInfo',JSON.stringify({ name:'rufeng', age:30})) ]
RNStorage.userInfo = {name: 'rufeng', age: 30};
};
XStorage.initStorage(RNStorage, AsyncStorage, initCallback);