React Native - как узнать, что хранится в AsyncStorage?

Я сохраняю некоторые элементы в AsyncStorage в React Native и использую отладчик Chrome и симулятор iOS.

Не реагируя, используя обычную веб-разработку localStorage, я смог увидеть сохраненные localStorage элементы в Chrome Debugger > Resources > Local Storage

Есть идеи, как я могу просмотреть элементы, сохраненные в React Native AsyncStorage?


person Wonka    schedule 25.07.2016    source источник
comment
Не уверен, существуют ли такие инструменты, я обычно просто запрашиваю их и передаю обратный вызов для его регистрации. AsyncStorage.getItem('thing').then((res) => console.log(res))   -  person agmcleod    schedule 25.07.2016
comment
Да, это то, что я сейчас делаю, но пытаюсь увидеть, есть ли визуальный способ увидеть все в хранилище.   -  person Wonka    schedule 25.07.2016
comment
Вставьте компонент пользовательского интерфейса github.com/vczero/rn-cook   -  person James    schedule 26.08.2016


Ответы (8)


Вы можете использовать reactotron, я думаю, у него есть Async Storage Explorer;) https://github.com/infinitered/reactotron

введите описание изображения здесь

person Fareed Alnamrouti    schedule 25.04.2017
comment
очень хорошие инструменты - person Behnam Mohammadi; 23.04.2018
comment
Это идеально, спасибо, что поделились этим инструментом. О, для другой зелени, такой как я, убедитесь, что у вас есть AsyncStorage.getItem(item); - person tmehta2442; 07.05.2018
comment
Привет @ tmehta2442 Я не получаю никаких журналов асинхронного хранилища с помощью reactotron. не могли бы вы опубликовать, как я могу получить все журналы асинхронного хранилища? Я использовал (asyncStorage ()) в моей конфигурации реактотрона. - person gamingumar; 22.04.2019
comment
@gamingumar Возможно, я опоздаю, но для этого я использовал специальные команды Reactotron: Reactotron.onCustomCommand('show_async_storage', () =>{ //here you could log all the async storage as needed }) Для фактического ведения журнала вы можете использовать ответ @skantus. Вот видео, объясняющее пользовательские команды в Reactotron видео - person Duilio; 12.12.2020

React Native Debugger это встроено.

Просто вызовите showAsyncStorageContentInDev() в консоли RND, и вы увидите дамп хранилища вашего приложения.

person Jayden    schedule 28.02.2018

Следующее должно работать,

AsyncStorage.getAllKeys((err, keys) => {
  AsyncStorage.multiGet(keys, (error, stores) => {
    stores.map((result, i, store) => {
      console.log({ [store[i][0]]: store[i][1] });
      return true;
    });
  });
});
person skantus    schedule 14.01.2019
comment
Спасибо. Я просто хотел что-то поскорее проверить, и это отлично сработало. - person Darryl Young; 31.03.2020

Я создал вспомогательный метод для регистрации всего хранилища в одном объекте (более чистый для регистрации, например, в Reactotron):

import AsyncStorage from '@react-native-community/async-storage';

export function logCurrentStorage() {
  AsyncStorage.getAllKeys().then((keyArray) => {
    AsyncStorage.multiGet(keyArray).then((keyValArray) => {
      let myStorage: any = {};
      for (let keyVal of keyValArray) {
        myStorage[keyVal[0]] = keyVal[1]
      }

      console.log('CURRENT STORAGE: ', myStorage);
    })
  });
}
person miqrc    schedule 10.08.2019
comment
Довольно полезно. Спасибо - person tahaf10; 17.08.2019

С помощью bluebird вы можете:

const dumpRaw = () => {
  return AsyncStorage.getAllKeys().then(keys => {
    return Promise.reduce(keys, (result, key) => {
      return AsyncStorage.getItem(key).then(value => {
        result[key] = value;
        return result;
      });
    }, {});
  });
};

dumpRaw().then(data => console.log(data));
person Tim Scott    schedule 20.04.2017
comment
поскольку вы используете функцию стрелки, вы можете использовать сокращенную функцию стрелки: вместо a => {return b=>{return c}} вы можете использовать a=>b=>c - person Fareed Alnamrouti; 30.05.2017

Может быть, поздно, но ни одно из этих решений мне не подходит. На Android откройте проводник файлов в Android Studio, затем перейдите в data / data / your_package_name. Внутри у вас должна быть папка с именем database < / strong> и внутри файла RKStorage.

Это файл SQLite3, так что возьмите свой любимый проводник SQLite и исследуйте его. Если вы хотите, то вот он: Браузер БД для SQLite

person Mayhem50    schedule 01.04.2020

Я не обнаружил, что в Reactotron включен какой-либо тип красивой печати, и он также является жестоко скрытым, поэтому я просто написал простую функцию с использованием lodash. Вы также можете использовать подчеркивание.

Предполагая, что у вас есть статическое сопоставление всех ваших ключей ...

const keys = {
  key1: 'key1',
  key2: 'key2'
}

export function printLocalStorage() {
  _.forEach(keys, (k, v) => {
    localStore.getAllDataForKey(v).then(tree => {
      console.log(k) // Logs key above the object
      console.log(tree) // Logs a pretty printed JSON object
    })
  })
}

Это неэффективно, но решает проблему.

person Phil Andrews    schedule 07.03.2018

Вы можете определить функцию для получения всех ключей, используя async и await

    getAllkeys = () => {
    return new Promise( async (resolve, reject) => {
    try {
      let keys = await AsyncStorage.getAllKeys();
      let items = await AsyncStorage.multiGet(keys)
      resolve(items)
    } catch (error) {
      reject(new Error('Error getting items from AsyncStorage: ' + error.message))
    }
  });
}


    somefunc = async () => {
    try {
    var items = await getAllkeys();
    var someItems = items.filter(function (result, i, item) {
          // do filtering stuff
          return item;
    });
    // do something with filtered items 
    } catch (error) {
    // do something with your error
    }
}
person Rebai Ahmed    schedule 10.08.2019