2016-04-18 5 views
1

У меня есть приложение, где я планирую вытащить некоторые данные с моего сервера, а затем сохранить эти данные с помощью AsyncStorage. Поэтому нет необходимости постоянно получать мои данные. Я достал пару jsons, используя fetch(), а затем сохранил их, используя AsyncStore.multiSet().AsyncStorage - многопользовательская транзакция?

Однако, если есть проблема с хранением одного из моих, около 5 объектов json в AsyncStorage, я не хочу их хранить. Чтобы данные были в правильном состоянии. Поэтому я хотел бы хранить их, используя транзакцию.

Итак, что произойдет, если в середине хранения моих объектов возникнет какая-то проблема, и сбой хранения. Например, если приложение было закрыто пользователем или закончилась их батарея.

Что произойдет в таком сценарии? Могут ли мои первые 2 объекта быть сохранены, а остальные 3 не сохранены?

ответ

3

Похоже, что это зависит от базовой реализации хранилища.

Глядя на the implementation of AsyncStorage.js, React Native ищет и использует RocksDB, затем SQLite, а затем AsyncLocalStorage в этом порядке, nad использует первый, который он может найти.

Я не мог найти никакой реализации RocksDB в коренной кодовой базе React. Глядя на документацию, хотя, кажется, что поддерживаются транзакции при использовании «TransactionDB или OptimisticTransactionDB»:

https://github.com/facebook/rocksdb/wiki/Transactions 

В случае SQLite является основной реализации:

https://github.com/facebook/react-native/blob/235b16d93287061a09c4624e612b5dc4f960ce47/ReactAndroid/src/main/java/com/facebook/react/modules/storage/AsyncStorageModule.java#L147 

это выглядит, как будто он пытается сохранить все это, возможно, может:

/** 
    * Inserts multiple (key, value) pairs. If one or more of the pairs cannot be inserted, this will 
    * return AsyncLocalStorageFailure, but all other pairs will have been inserted. 
    * The insertion will replace conflicting (key, value) pairs. 
    */ 
    @ReactMethod 
    public void multiSet(final ReadableArray keyValueArray, final Callback callback) { 

Наконец, судя по the React Native implementation of AsyncLocalStorage, окончательную возможность нижележащих осущ Как представляется, он также сохраняет все возможное, сохраняя ошибки неудачных случаев, когда они происходят:

for (NSArray<NSString *> *entry in kvPairs) { 
    NSDictionary *keyError = [self _writeEntry:entry changedManifest:&changedManifest]; 
    RCTAppendError(keyError, &errors); 
    } 
Смежные вопросы