2

サーバーからデータを取得し、AsyncStorage を使用してそのデータを保存する予定のアプリがあります。したがって、常にデータをフェッチする必要はありません。を使用していくつかの json を取得し、fetch()それらを使用して保存しますAsyncStore.multiSet()

ただし、私の約 5 つの json オブジェクトの 1 つを AsyncStorage に格納する際に問題がある場合は、それらのいずれも格納したくありません。データを正しい状態に保つため。そのため、トランザクションを使用してそれらを保存したいと思います。

オブジェクトの保存中に問題が発生し、保存に失敗した場合はどうなるでしょうか。たとえば、ユーザーがアプリを閉じた場合や、バッテリーが切れた場合などです。

そのようなシナリオではどうなりますか?最初の 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 に答える