React Native AsyncStorage存储除字符串以外的值

时间:2016-02-24 07:48:43

标签: ios local-storage storage react-native

有没有办法用AsyncStorage存储字符串以外的值?我想存储简单的布尔值,例如。

AsyncStorage.setItem('key', 'ok');

没问题,但是:

AsyncStorage.setItem('key', false);

不起作用..

6 个答案:

答案 0 :(得分:45)

基于AsyncStorage React-native docs,我担心你只能存储字符串..

static setItem(key: string, value: string, callback?: ?(error: ?Error)
> => void) 
  

设置键的值并在完成时调用回调,以及   如果有错误。返回一个Promise对象。

您可能想尝试查看第三方软件包。也许是this one

编辑02/11/2016

感谢@Stinodes的伎俩。

虽然你只能存储字符串,但你也可以使用JSON对对象和数组进行字符串化来存储它们,然后在检索它们之后再次解析它们。

这只适用于普通的Object-instances或数组,但是,从任何原型继承的Objects可能会导致意外问题。

一个例子:

// 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
    }
})

答案 1 :(得分:32)

您只能存储字符串,但您可以使用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

获取并解析该值(不必是布尔值,它可以是一个对象。无论哪个满足您的需求),您可以设置状态或对其执行任何操作。

答案 2 :(得分:6)

我在" name"中设置了值键入AsyncStorage

AsyncStorage.setItem("name", "Hello");

从key" name"

获取价值
AsyncStorage.getItem("name").then((value) => {
   console.log("Get Value >> ", value);
}).done();
  

输出如下:

'Get Values >> ', 'Hello'

答案 3 :(得分:3)

我总是围绕AsyncStorage使用/创建包装器模块,对传入和传出的数据利用JSON.parse和JSON.stringify。

通过这种方式,您无需在业务逻辑中进行JSON.parse和JSON.stringify调用。这样可以使代码更加美观。

类似

def set_cookies(cookies, s):
    for cookie in cookies:
        if 'httpOnly' in cookie:
            httpO = cookie.pop('httpOnly')
            cookie['rest'] = {'httpOnly': httpO}
        if 'expiry' in cookie:
            cookie['expires'] = cookie.pop('expiry')
        s.cookies.set(**cookie)
    return s

答案 4 :(得分:0)

 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");
               }
           });

答案 5 :(得分:0)

我建议您使用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);