首页 > 解决方案 > 如何更新已保存的项目 AsyncStorage

问题描述

尝试 mergeItem 时出现错误的屏幕截图我试图保存每个用户在我的应用程序中执行的一些最近搜索我使用 Asyncstorage 设置项,但这会删除以前的搜索并且 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
}
};

这里的目标是获得用户最近搜索的列表,并在他搜索时更新列表

标签: react-nativeexpoasyncstorage

解决方案


问题是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
  }
};

它很复杂,并不理想,但它应该可以工作。


推荐阅读