在 AsyncStorage React Native 上保存 Object 数组
Saving Array of Object on AsyncStorage React Native
我正在尝试保存和读取本地存储中 object 数组的数据。保存过程已经完成,下面是我的 object 结构以提供更多见解:
有两种类型的类别:INCOME 和 OUTCOME,因此我在保存条目时将这些类别用作我的 KEY,完整代码如下所示:
const onSubmit = async () => {
const newData = {
category: type,
title: title,
note: note,
amount: amount,
date: date,
};
try {
const jsonData = JSON.stringify(newData);
let existingTransactions = await getTransaction(newData.category);
const updatedTransactions = [...existingTransactions, jsonData];
await AsyncStorage.setItem(
newData.category,
JSON.stringify(updatedTransactions)
);
} catch (err) {
console.log(err);
}
};
const getTransaction = async (category) => {
let transactions = await AsyncStorage.getItem(category);
if (transactions) {
return JSON.parse(transactions);
} else {
return [];
}
};
基本上在保存新的 object 之前,我需要读取之前保存的数组,然后将新的 object 推入现有数组,最后使用 setItem 将它们全部保存。
下面是 object 的数组,每当我保存新的 object 时它打印在控制台上:
我的问题是:
1.我用 KEY 做正确的事吗?或者我应该让每个 object 的密钥都是唯一的?
2。每当我尝试使用 getItem 读取这些数组然后映射数组时,我无法获得我想要的数据,我只能获得完整的 object 如下所示:
但我不能只说类别或每个 object 的标题。
这是我用来读取数组的代码:
const [data, setData] = useState([]);
useEffect(() => {
async function fetchData() {
const value = await AsyncStorage.getItem(category);
const arrayData = JSON.parse(value);
console.log(arrayData);
setData(arrayData);
}
fetchData();
}, []);
{data.map((entry, index) => {
return <Text key={index}>{entry}</Text>;
})}
任何存储在 AsyncStorage 中的东西都应该有一个唯一的键来相应地获取它
您可以存储数组并相应地获取数组,然后按类别名称
获取特定的json对象
let category = transactions.find(o => o.category === 'Your category name');
我熟悉 React.js,不熟悉 React Native。但是,根据我的阅读,您过早使用 JSON.stringify
犯了一个错误。
// const onSubmit = async () => {
// ...
try {
const jsonData = JSON.stringify(newData); // convert object to string
let existingTransactions = await getTransaction(newData.category);
const updatedTransactions = [...existingTransactions, jsonData]; // you're having array of string, not array of object
await AsyncStorage.setItem(
newData.category,
JSON.stringify(updatedTransactions)
);
}
// ...
先去掉 JSON.stringify
,然后像这样稍微改变一下代码
// const onSubmit = async () => {
// ...
try {
let existingTransactions = await getTransaction(newData.category);
const updatedTransactions = [...existingTransactions, newData]; // notice the newData here
await AsyncStorage.setItem(
newData.category,
JSON.stringify(updatedTransactions)
);
}
// ...
先清空存储,然后再试。
Demikianlah.
我正在尝试保存和读取本地存储中 object 数组的数据。保存过程已经完成,下面是我的 object 结构以提供更多见解:
有两种类型的类别:INCOME 和 OUTCOME,因此我在保存条目时将这些类别用作我的 KEY,完整代码如下所示:
const onSubmit = async () => {
const newData = {
category: type,
title: title,
note: note,
amount: amount,
date: date,
};
try {
const jsonData = JSON.stringify(newData);
let existingTransactions = await getTransaction(newData.category);
const updatedTransactions = [...existingTransactions, jsonData];
await AsyncStorage.setItem(
newData.category,
JSON.stringify(updatedTransactions)
);
} catch (err) {
console.log(err);
}
};
const getTransaction = async (category) => {
let transactions = await AsyncStorage.getItem(category);
if (transactions) {
return JSON.parse(transactions);
} else {
return [];
}
};
基本上在保存新的 object 之前,我需要读取之前保存的数组,然后将新的 object 推入现有数组,最后使用 setItem 将它们全部保存。 下面是 object 的数组,每当我保存新的 object 时它打印在控制台上:
我的问题是:
1.我用 KEY 做正确的事吗?或者我应该让每个 object 的密钥都是唯一的?
2。每当我尝试使用 getItem 读取这些数组然后映射数组时,我无法获得我想要的数据,我只能获得完整的 object 如下所示:
但我不能只说类别或每个 object 的标题。
这是我用来读取数组的代码:
const [data, setData] = useState([]);
useEffect(() => {
async function fetchData() {
const value = await AsyncStorage.getItem(category);
const arrayData = JSON.parse(value);
console.log(arrayData);
setData(arrayData);
}
fetchData();
}, []);
{data.map((entry, index) => {
return <Text key={index}>{entry}</Text>;
})}
任何存储在 AsyncStorage 中的东西都应该有一个唯一的键来相应地获取它
您可以存储数组并相应地获取数组,然后按类别名称
获取特定的json对象 let category = transactions.find(o => o.category === 'Your category name');
我熟悉 React.js,不熟悉 React Native。但是,根据我的阅读,您过早使用 JSON.stringify
犯了一个错误。
// const onSubmit = async () => {
// ...
try {
const jsonData = JSON.stringify(newData); // convert object to string
let existingTransactions = await getTransaction(newData.category);
const updatedTransactions = [...existingTransactions, jsonData]; // you're having array of string, not array of object
await AsyncStorage.setItem(
newData.category,
JSON.stringify(updatedTransactions)
);
}
// ...
先去掉 JSON.stringify
,然后像这样稍微改变一下代码
// const onSubmit = async () => {
// ...
try {
let existingTransactions = await getTransaction(newData.category);
const updatedTransactions = [...existingTransactions, newData]; // notice the newData here
await AsyncStorage.setItem(
newData.category,
JSON.stringify(updatedTransactions)
);
}
// ...
先清空存储,然后再试。 Demikianlah.