2016-04-18 9 views
1

Ich habe eine App, wo ich einige Daten von meinem Server ziehen und dann diese Daten mit AsyncStorage speichern möchte. Es wird also nicht notwendig sein, meine Daten ständig abzuholen. Ich hole ein paar Jsons mit fetch() und speichern Sie sie dann unter Verwendung AsyncStore.multiSet().AsyncStorage - Ist multiSet() transaktional?

Wenn jedoch ein Problem beim Speichern eines meiner ca. 5 Json-Objekte in AsyncStorage auftritt, möchte ich keine davon speichern. Um die Daten in einem korrekten Zustand zu halten. Daher möchte ich sie mit einer Transaktion speichern.

So was passieren würde, wenn in der Mitte der Speicherung meiner Objekte gibt es ein Problem und die Speicherung schlägt fehl. Zum Beispiel, wenn die App vom Benutzer geschlossen wurde oder wenn der Akku leer ist.

Was würde in einem solchen Szenario passieren? Könnten meine ersten 2 Objekte gespeichert und die anderen 3 nicht gespeichert werden?

Antwort

3

Es scheint wie es variiert basierend auf der zugrunde liegenden Speicherimplementierung.

Mit Blick auf the implementation of AsyncStorage.js, React Native sucht und verwendet RocksDB, dann SQLite und dann AsyncLocalStorage in dieser Reihenfolge, nad verwendet die erste, die es finden kann.

Ich konnte keine RocksDB-Implementierung innerhalb der react-Native-Codebasis finden. Mit Blick auf die Dokumentation, so scheint es allerdings, als ob Transaktionen unterstützt werden bei der Verwendung von ‚TransactionDB oder OptimisticTransactionDB‘:

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

Im Fall von SQLite die zugrunde liegende Implementierung zu sein:

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

es sieht aus, als ob es versucht, alles zu retten nur irgend möglich:

/** 
    * 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) { 

schließlich von the React Native implementation of AsyncLocalStorage zu urteilen, die letzte Möglichkeit der zugrunde liegenden impl Es scheint, als ob es auch alles speichert, was es möglicherweise kann, die Fehler der gescheiterten Fälle speichernd, wie sie geschehen:

for (NSArray<NSString *> *entry in kvPairs) { 
    NSDictionary *keyError = [self _writeEntry:entry changedManifest:&changedManifest]; 
    RCTAppendError(keyError, &errors); 
    }