Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios React本机异步存储存储字符串以外的值_Ios_Local Storage_Storage_React Native - Fatal编程技术网

Ios React本机异步存储存储字符串以外的值

Ios React本机异步存储存储字符串以外的值,ios,local-storage,storage,react-native,Ios,Local Storage,Storage,React Native,是否有任何方法可以使用异步存储存储字符串以外的值?例如,我想存储简单的布尔值 AsyncStorage.setItem('key', 'ok'); 没问题,但是: AsyncStorage.setItem('key', false); 不工作..基于,恐怕您只能存储字符串 static setItem(key: string, value: string, callback?: ?(error: ?Error) > => void) 设置键的值并在完成时调用回调,以及 如果存

是否有任何方法可以使用异步存储存储字符串以外的值?例如,我想存储简单的布尔值

AsyncStorage.setItem('key', 'ok');
没问题,但是:

AsyncStorage.setItem('key', false);
不工作..

基于,恐怕您只能存储字符串

static setItem(key: string, value: string, callback?: ?(error: ?Error)
> => void) 
设置键的值并在完成时调用回调,以及 如果存在任何错误,则返回错误。返回承诺对象

您可能希望尝试查看第三方软件包。也许吧

编辑2016年11月2日

谢谢@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将对象和数组完全字符串化,并在将它们从本地存储中取出时再次解析它们。
但是,这只适用于普通的
对象
-实例或数组

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

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

JSON.stringify(false) // "false"
JSON.parse("false")   // false
因此:

获取并解析值(不必是布尔值,它可以是对象。满足您需要的任何对象)后,您可以将其设置为状态或对其执行任何操作。

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

AsyncStorage.setItem("name", "Hello");
从键“name”获取值

输出如下:


我总是围绕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) {}
}
我建议您使用,通过它您可以同步异步访问存储,还可以存储和检索对象、字符串或布尔数据

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

是的,这就是它看起来的样子,虽然我认为它应该比那更好。谢谢。是的,但看看第三方库,其中一些非常强大和有用。我将如何存储布尔值。当我字符串化它时,我得到了一个promise对象作为回报。如果你使用回调而不是promise方法,回调的签名实际上是:
function(err,value)=>JSON.parse(value)
@patrickbass但你是对的,我的错。在写我的答案之前,我愚蠢地没有在他们的文档中确认。不过我现在已经编辑过了。谢谢你指出这一点
'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");
               }
           });
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) {}
}
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);