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

Has*_*sen 32 storage local-storage ios react-native

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

AsyncStorage.setItem('key', 'ok');
Run Code Online (Sandbox Code Playgroud)

没问题,但是:

AsyncStorage.setItem('key', false);
Run Code Online (Sandbox Code Playgroud)

不起作用..

G. *_*ide 53

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

static setItem(key: string, value: string, callback?: ?(error: ?Error)
> => void) 
Run Code Online (Sandbox Code Playgroud)

设置键的值并在完成时调用回调,如果有则设置错误.返回Promise对象.

您可能想尝试查看第三方软件包.也许这一个.

编辑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
    }
})
Run Code Online (Sandbox Code Playgroud)


sti*_*des 36

您只能存储字符串,但您可以使用JSON完全对对象和数组进行字符串化,并在将它们从本地存储中拉出时再次解析它们.
但这只适用于普通Object实例或数组.

从任何原型继承的对象可能会导致一些意外行为,因为原型不会被解析为JSON.

JSON.stringify然而,可以使用布尔(或任何原语)来存储.
JSON识别这些类型,并且可以双向解析它们.

JSON.stringify(false) // "false"
JSON.parse("false")   // false
Run Code Online (Sandbox Code Playgroud)

所以:

// 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
Run Code Online (Sandbox Code Playgroud)

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


BK1*_*K19 8

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

AsyncStorage.setItem("name", "Hello");
Run Code Online (Sandbox Code Playgroud)

从关键"名称"获取价值

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

输出如下:

'Get Values >> ', 'Hello'
Run Code Online (Sandbox Code Playgroud)


Lee*_*ley 8

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

这样,您就无需在业务逻辑中调用 JSON.parse 和 JSON.stringify。这使代码看起来更美观。

就像是

import AsyncStorage from '@react-native-async-storage/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, callback) => {
        
        try {
            const item = JSON.stringify(value);

            return await AsyncStorage.setItem(key, item, callback);
        } 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) {}
}
Run Code Online (Sandbox Code Playgroud)