AsyncStorage - 是multiSet()事务?

时间:2016-04-18 10:53:33

标签: react-native asyncstorage

我有一个应用程序,我计划从服务器中提取一些数据,然后使用AsyncStorage存储该数据。因此不需要不断获取我的数据。 我使用fetch()获取了几个jsons,然后使用AsyncStore.multiSet()存储它们。

但是,如果在AsyncStorage中存储我的一个约5个json对象时出现问题,我不希望存储它们中的任何一个。保持数据处于正确状态。因此我想使用交易存储它们。

那么如果在存储我的对象的过程中存在一些问题并且存储失败会发生什么。例如,如果应用程序被用户关闭或者电池电量耗尽。

在这种情况下会发生什么?可以保存我的前2个对象而不保存其他3个对象吗?

1 个答案:

答案 0 :(得分:3)

似乎它根据底层存储实现而有所不同。

查看the implementation of AsyncStorage.js,React Native按顺序查找并使用RocksDB,然后是SQLite,然后是AsyncLocalStorage,nad使用它可以找到的第一个。

我似乎无法在React Native代码库中找到任何RocksDB实现。但是,查看文档时,似乎在使用“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);
  }