Как обновить сохраненные элементы 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
}
};

Цель здесь состоит в том, чтобы получить список последних поисков, которые выполнял пользователь, и обновить этот список, если он выполняет поиск.


person J.lan    schedule 22.01.2019    source источник


Ответы (1)


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

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

person Andrew    schedule 22.01.2019
comment
Привет спасибо! но в журнале перехвата появляется следующая ошибка numberArray.push is not a function. (In 'numberArray.push(numberToSave)', 'numberArray.push' is undefined) * screens/HomeScreen.js:121:23 in _callee4$ - person J.lan; 22.01.2019
comment
Вероятно, это потому, что значение, которое вы сохранили для SNUMBER, ранее не было массивом. Вам необходимо перезаписать то, что вы сохранили для этого значения, или удалить приложение со своего устройства и переустановить. Также я сказал, что вам следует провести дополнительные проверки, чтобы убедиться, что это массив. В качестве альтернативы вы можете просто изменить имя ключа, которое вы сохраняете в AsyncStorage как - person Andrew; 22.01.2019
comment
Спасибо вам! изменение имени SNUMBER работало нормально - person J.lan; 22.01.2019