Ga naar hoofdinhoud

AsyncStorage

AsyncStorage is een manier om data op te slaan op de telefoon. Dit is een soort van lokale database. We kunnen hiermee data opslaan die we nodig hebben voor de app. Dit is zeer gelijkaardig aan de localStorage in een web browser.

Dit geeft het voordeel dat je data kan opslaan die je wil bijhouden als je de applicatie sluit.

Installatie

Om AsyncStorage te gebruiken moeten we eerst de @react-native-async-storage/async-storage library installeren:

npx expo install @react-native-async-storage/async-storage

Opslaan/uitlezen van een string

Om een string op te slaan in AsyncStorage gebruiken we de setItem functie. Deze functie heeft twee parameters: de key en de value. De key is een string die we gebruiken om de value later terug op te halen. De value is de string die we willen opslaan.

import React from "react";

import { View, Text, Button } from "react-native";
import AsyncStorage from "@react-native-async-storage/async-storage";

const storeData = async () => {
await AsyncStorage.setItem("name", "John Doe");
};

const getData = async () => {
const value = await AsyncStorage.getItem("name");
if (value !== null) {
alert(value);
} else {
alert("No Data found");
}
};
const App = () => {
return (
<View>
<Text>AsyncStorage</Text>
<Button title="Store Data" onPress={storeData} />
<Button title="Load Data" onPress={getData } />
</View>
);
};

export default App;

Opslaan/uitlezen van een getal

Wil je een getal rechtstreeks opslagen in AsyncStorage dan moet je eerst de waarde omzetten naar een string. Dit kan je doen met de toString functie. Om een getal terug te halen uit AsyncStorage moet je eerst de string omzetten naar een getal. Dit kan je doen met de parseInt functie.

import React from "react";

import { View, Text, Button } from "react-native";
import AsyncStorage from "@react-native-async-storage/async-storage";

const storeData = async () => {
let randomNumber : number = Math.floor(Math.random() * 100);
await AsyncStorage.setItem("randomNumber", randomNumber.toString());
};

const getData = async () => {
const value : string = await AsyncStorage.getItem("randomNumber");
if (value !== null) {
alert(parseInt(value));
} else {
alert("No Data found");
}
};
const App = () => {
return (
<View>
<Text>AsyncStorage</Text>
<Button title="Store Data" onPress={storeData} />
<Button title="Load Data" onPress={getData } />
</View>
);
};

export default App;

Opslaan/uitlezen van een object

Om een object op te slaan in AsyncStorage moet je eerst het object omzetten naar een string. Dit kan je doen met de JSON.stringify functie. Om een object terug te halen uit AsyncStorage moet je eerst de string omzetten naar een object. Dit kan je doen met de JSON.parse functie.

import React from "react";

import { View, Text, Button } from "react-native";
import AsyncStorage from "@react-native-async-storage/async-storage";

interface Student {
name: string;
age: number;
}

const storeData = async () => {
let student : Student = {
name: "John Doe",
age: Math.floor(Math.random() * 10) + 18
};
await AsyncStorage.setItem("randomStudent", JSON.stringify(student));
};

const getData = async () => {
const value : string = await AsyncStorage.getItem("randomStudent");
if (value !== null) {
let student : Student = JSON.parse(value);
alert(student.name + " is " + student.age + " years old");
} else {
alert("No Data found");
}
};
const App = () => {
return (
<View>
<Text>AsyncStorage</Text>
<Button title="Store Data" onPress={storeData} />
<Button title="Load Data" onPress={getData } />
</View>
);
};

export default App;

Je kan ook een array van objecten opslaan in AsyncStorage. Dit werkt op dezelfde manier als een enkel object.

State in AsyncStorage

We kunnen ook de state van een component opslaan in AsyncStorage. Dit kan handig zijn als we de state willen bijhouden als de gebruiker de applicatie sluit. We moeten er dan voor zorgen dat elke wijziging in state ook opgeslagen wordt in AsyncStorage.

import React, { useState, useEffect } from "react";
import { View, Text, Button } from "react-native";
import AsyncStorage from "@react-native-async-storage/async-storage";

const App = () => {
const [counter, setCounter] = useState(0);

useEffect(() => {
const getData = async () => {
const value = await AsyncStorage.getItem("counter");
if (value !== null) {
setCounter(parseInt(value));
}
};
getData();
}, []);

useEffect(() => {
const storeData = async () => {
await AsyncStorage.setItem("counter", counter.toString());
};
storeData();
}, [counter]);

return (
<View>
<Text>AsyncStorage</Text>
<Text>Counter: {counter}</Text>
<Button title="Increment" onPress={() => setCounter(counter + 1)} />
</View>
);
};

export default App;

We gebruiken hier twee useEffect hooks. De eerste useEffect hook wordt uitgevoerd als het component voor het eerst geladen wordt. In deze useEffect hook halen we de waarde van counter op uit AsyncStorage. Als er een waarde gevonden wordt dan zetten we deze waarde in de state van het component. Als er geen waarde gevonden wordt dan blijft de state op 0 staan.

De tweede useEffect hook wordt uitgevoerd als de state van counter verandert. In deze useEffect hook slaan we de nieuwe waarde van counter op in AsyncStorage.

Meer informatie

Voor meer informatie over de AsyncStorage package kan je de documentatie raadplegen.