Как обновить сохраненные элементы AsyncStorage - PullRequest
0 голосов
/ 22 января 2019

Снимок экрана с ошибкой при попытке mergeItem Я пытаюсь сохранить некоторые недавние поиски, которые выполняет каждый пользователь в моем приложении. Я установилItem с помощью 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
}
};

Цель здесь - получить список последних поисков, которые пользователь выполнил, и обновить список, которые он ищет

1 Ответ

0 голосов
/ 22 января 2019

Проблема в том, что 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
  }
};

Он запутанный и не идеальный, но должен работать.

...