I've been building a journal app and i want to save the days in AsyncStorage, that works but if I want to add an day it's getting weired this is my funtionc:
This is the return:
[[[{"date":"t","value":"t","name":"t"}],{"date":"p","value":"p","name":"p"}],{"date":"h","value":"h","name":"h"}]
async function createDay(date: string, journal: string, name: string) {
try {
try {
const getalldays = await AsyncStorage.getItem('@journal')
const alldays = await JSON.parse(getalldays!)
if (JSON.parse(alldays!) !== null) {
console.log('SHORT')
await alldays!.push(JSON.parse(alldays!))
}
const newDay = { date: date, value: journal, name: name }
await alldays.push(newDay)
await AsyncStorage.setItem('@journal', JSON.stringify(alldays))
const newall = await AsyncStorage.getItem('@journal')
console.log(newall)
return;
} catch (error) {
console.log(error)
return;
}
} catch (err) {
console.error(err)
}
}
CodePudding user response:
As far as I understand the problem, you want to store the data in this format
[
{ date: 'h', value: 'h', name: 'h' },
{ date: 'h', value: 'h', name: 'h' },
{ date: 'h', value: 'h', name: 'h' },
{ date: 'h', value: 'h', name: 'h' },
]
I would suggest you to create a helper file for all Storage operations
Step 1:
Create a folder called storage
where your App.js
is located. Now inside storage
folder, create a file called AsyncStore.js
which should look like this
AsyncStore.js
import AsyncStorage from '@react-native-async-storage/async-storage';
const setData = async (token, value) => {
try {
await AsyncStorage.setItem(token, JSON.stringify(value));
return true;
} catch (e) {
return false;
}
};
const getData = async (token) => {
try {
const jsonValue = await AsyncStorage.getItem(token);
return jsonValue != null ? JSON.parse(jsonValue) : null;
} catch (e) {
return null;
}
};
const removeData = async (token) => {
try {
await AsyncStorage.removeItem(token);
} catch (e) {
return null;
}
};
export default { setData, getData, removeData };
Step 2:
Change your storing function createDay
to this
async function createDay(date, journal, name) {
try {
const response = await Storage.getData('@journal'); // Get last data stored
let tempData = []; // Make a new array
if (response) tempData = [...response]; // Copy elements if array is not null
tempData.push({ date: 'h', value: 'h', name: 'h' }); // Push New element to array
await Storage.setData('@journal', tempData); // Set new Array in local Storage
} catch (err) {
console.error(err); // Some error while storing data
}
}
Result
I've made an example Snack here for you to see the working implementation. If you want to check if data is getting stored perfectly, you can check as shown below
import * as React from 'react';
import { Text, View, StyleSheet, Button } from 'react-native';
import AsyncStore from './storage/AsyncStore';
export default function App() {
const [JournalData, SetJournalData] = React.useState([]);
React.useEffect(() => {
RestoreData(); // Restoring the last data stored here
}, []);
const RestoreData = async () => {
try {
const response = await AsyncStore.getData('@journal');
if (response) {
console.log(response);
SetJournalData(response);
}
} catch (e) {
console.log(e);
}
};
async function createDay(date, journal, name) {
try {
const response = await AsyncStore.getData('@journal'); // Get last data stored
let tempData = []; // Make a new array
if (response) tempData = [...response]; // Copy elements if array is not null
tempData.push({ date: 'h', value: 'h', name: 'h' }); // Push New element to array
SetJournalData(tempData);
await AsyncStore.setData('@journal', tempData); // Set new Array in local Storage
} catch (err) {
console.error(err); // Some error while storing data
}
}
return (
<View style={styles.container}>
<Button title="Add Some Data" onPress={createDay} />
<Text>{`Listing total ${JournalData.length} items`}</Text>
{JournalData.map((item, index) => (
<Text
key={
index
}>{`item Number = ${index} date = ${item.date} value = ${item.value} name = ${item.name}`}</Text>
))}
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
backgroundColor: '#ecf0f1',
padding: 8,
},
});