2

我有一个应用程序,我计划从服务器中提取一些数据,然后使用 AsyncStorage 存储这些数据。所以不需要不断地获取我的数据。我使用获取几个 json fetch(),然后使用AsyncStore.multiSet().

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

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

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

4

1 回答 1

4

它似乎因底层存储实现而异。

查看的实现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) {

最后,从React Native 的实现来看AsyncLocalStorage,底层实现的最终可能性,似乎它也尽可能地保存了一切,在失败案例发生时存储错误:

  for (NSArray<NSString *> *entry in kvPairs) {
    NSDictionary *keyError = [self _writeEntry:entry changedManifest:&changedManifest];
    RCTAppendError(keyError, &errors);
  }
于 2016-06-15T21:32:27.793 回答