web-dev-qa-db-fra.com

React Native AsyncStorage stockant des valeurs autres que des chaînes

Existe-t-il un moyen de stocker des valeurs autres que des chaînes avec AsyncStorage? Je veux par exemple stocker des valeurs booléennes simples.

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

Ce n'est pas un problème, mais:

AsyncStorage.setItem('key', false);

Ne marche pas..

31
Hasen

Basé sur les documents natifs d'AsyncStorage React , je crains que vous ne puissiez stocker que des chaînes ..

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

Définit la valeur de la touche et appelle le rappel à la fin, ainsi qu'une erreur s'il y en a. Renvoie un objet Promise.

Vous voudrez peut-être essayer de jeter un œil aux packages tiers. Peut-être celui-ci .

Modifier le 11/02/2016

Merci @Stinodes pour l'astuce.

Bien que vous ne puissiez stocker que des chaînes, vous pouvez également filtrer les objets et les tableaux avec JSON pour les stocker, puis les analyser à nouveau après les avoir récupérés.

Cela ne fonctionnera correctement qu'avec des instances d'objets ou des tableaux simples, cependant, les objets héritant de tous les prototypes peuvent provoquer des problèmes inattendus.

Un exemple :

// 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
    }
})
51
G. Hamaide

Vous ne pouvez stocker que des chaînes, mais vous pouvez totalement stringifier les objets et les tableaux avec JSON, et les analyser à nouveau lorsque vous les retirez du stockage local.
Cela ne fonctionnera cependant correctement qu'avec des instances ou des tableaux simples de Object.

Les objets hérités de n'importe quel prototype peuvent provoquer un comportement inattendu, car les prototypes ne seront pas analysés en JSON.

Les booléens (ou toute primitive d'ailleurs) peuvent être stockés à l'aide de JSON.stringify, bien que.
JSON reconnaît ces types et peut les analyser dans les deux sens.

JSON.stringify(false) // "false"
JSON.parse("false")   // false

Alors:

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

Après avoir obtenu et analysé la valeur (qui ne doit pas nécessairement être un booléen, il peut s'agir d'un objet. Celui qui répond à vos besoins), vous pouvez définir l'état ou faire tout ce qu'il faut.

34
stinodes

J'ai défini une valeur dans la clé "nom" dans AsyncStorage

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

Pour obtenir la valeur de la clé "nom"

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

La sortie sera la suivante:

'Get Values >> ', 'Hello'
8
BK19