如何更新保存的项目AsyncStorage

时间:2019-01-22 15:18:31

标签: react-native expo asyncstorage

ScreenShot of error when trying mergeItem我试图使用Asyncstorage保存每个用户在我的应用程序setItem中所做的一些最近的搜索,但这会删除以前的搜索,mergeItem在这里似乎不起作用,建议吗?

_storeSearches = async (numberToSave) => {
try {
 await AsyncStorage.mergeItem('SNUMBER', numberToSave);
} catch (error) {
  // Error saving data
}
};

_retrievePhoneNumberSearches = async () => {
try {
  const value = await AsyncStorage.setItem('SNUMBER');
  if (value !== null) {
    return JSON.parse(value);
  }
  return [];
} catch (error) {
  // Error retrieving data
}
};

此处的目标是获得用户最近进行的搜索的列表,并在用户进行搜索后更新列表

1 个答案:

答案 0 :(得分:0)

问题是mergeItem仅适用于使用key/value对的对象,似乎您想使用它来更新数组。

  

假定两个值都将现有键值与输入值合并   是字符串化的JSON。

因此,执行类似操作将更新存储的原始对象。

await AsyncStorage.setItem('person', JSON.stringify({age: 36 }));
await AsyncStorage.mergeItem('person', JSON.stringify({name: 'Chris'}))
let person = await AsyncStorage.getItem('person')

如果我们查看person变量,它将是对象{age: 36, name: 'Chris'}

但是当您尝试更新数组时,我认为它不起作用。但是,有一种复杂的方法可以使AsyncStorage为您工作。

  1. 首先设置一个空数组
  2. 检查是否有SNUMBER的值
  3. 如果使用保存的阵列更新阵列
  4. numberToSave放入数组
  5. 将数组保存到AsyncStorage(记住要进行字符串化处理)

这是代码

_storeSearches = async (numberToSave) => {
  let numberArray = [];
  try {
    let storedNumbers = await AsyncStorage.getItem('SNUMBER');
    if (storedNumbers !== null) {
      numberArray = JSON.parse(storedNumbers); // you could do some additional checks to make sure it is an array
    }
    numberArray.push(numberToSave)
    await AsyncStorage.setItem('SNUMBER', JSON.stringify(numberArray));
  } catch (error) {
    // Error saving data
  }
};

这令人费解,但并不理想,但它应该可以工作。