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

mkshixfv  于 2023-03-31  发布在  React
关注(0)|答案(7)|浏览(130)

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

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

是没有问题的,但是:

AsyncStorage.setItem('key', false);

不工作..

n3h0vuf2

n3h0vuf21#

基于AsyncStorage React-native文档,恐怕你只能存储字符串。

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

设置key的值,并在完成时调用回调沿着如果有错误,则返回一个Promise对象。
你可能想试着看看第三方的软件包。也许是this one
2016年2月11日**
谢谢@Stinodes的把戏。
虽然只能存储字符串,但也可以使用JSON对对象和数组进行字符串化以存储它们,然后在检索后再次解析它们。
这只适用于普通的Object示例或数组,但是,从任何原型继承的Object可能会导致意外的问题。
举个例子:

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

ulydmbyx2#

你只能存储字符串,但是你可以完全用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

在获取并解析值(不一定是布尔值,它可以是一个对象,无论哪个满足你的需要)之后,你可以设置到状态或对它做任何事情。

ru9i0ody

ru9i0ody3#

我在AsyncStorage中的“name”键中设置了值

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

从键“name”获取值

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

产出如下:

'Get Values >> ', 'Hello'
efzxgjgh

efzxgjgh4#

我总是围绕AsyncStorage使用/创建一个 Package 器modulee,对进出的数据使用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) {}
}
lyfkaqu1

lyfkaqu15#

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

but5z9lq6#

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

omjgkv6w7#

传递一个toString函数给它... AsyncStorage要求键是字符串,而不是数字。
这里:await AsyncStorage.setItem(item.id.toString(),'true');

相关问题