Ich verwende Parse.com
als Backend für meine App. Sie bieten auch eine lokale Datenbank zum Speichern von Informationen als Alternative zu SQLite
.
Ich möchte Telefonnummern mit phase zu meiner Datenbank hinzufügen. Bevor ich eine Nummer hinzufüge, muss ich prüfen, ob die Nummer bereits in der Datenbank existiert, also verwende ich findInBackground()
, um eine Liste von Zahlen zu erhalten, die mit der Zahl übereinstimmen, die ich hinzufügen möchte. Wenn die Liste leer ist, existiert die Nummer, die ich hinzufügen möchte, nicht in der Datenbank.
Die Methode hierfür lautet:
%Vor%Dann rufe ich diese Methode dreimal auf, um drei Zahlen hinzuzufügen:
%Vor% Beachten Sie, dass die dritte Nummer mit der ersten identisch ist und nicht zur Datenbank hinzugefügt werden sollte. Aber das logcat
zeigt:
Die dritte Zahl wurde hinzugefügt, auch wenn das nicht der Fall war, weil fintInBackground()
fast gleichzeitig in 3 Hintergrund-Threads läuft, so dass es keine Nummer in der Datenbank gibt, wie die, die ich möchte hinzufügen.
In diese Frage hat mir ein Typ gesagt, dass ich sie benutzen soll Bolts
Bibliothek von Parse
. Ich lese darüber von hier und einigen Parse
-Blog-Beiträgen, aber ich verstehe nicht, wie ich das verwenden soll die Methode, die ich bereits habe, und wie man die nacheinander auszuführenden Abfragen syncronisiert.
Wenn jemand mit dieser Bibliothek gearbeitet hat, leite mich bitte dazu oder gib einige grundlegende Beispiele, damit ich den Arbeitsablauf verstehen kann.
Danke!
Es klingt, als hättest du eine Race Condition. Es gibt viele verschiedene Möglichkeiten, wie Sie dieses Problem lösen können. Hier ist eine Alternative ohne Schrauben.
Das Hauptproblem besteht darin, dass die Suchanfragen ungefähr zur gleichen Zeit stattfinden, so dass sie keine Duplikate in der Datenbank finden. In diesem Fall ist es die Art und Weise, wie wir es lösen, nur eine Person zu suchen und hinzuzufügen, offensichtlich nicht auf dem Hauptthread, da wir die Suche nach ui nicht anbinden wollen. Also machen wir eine Liste, die zwei Dinge macht 1) enthält Elemente, die hinzugefügt werden müssen, 2) überprüft, dass sie hinzugefügt werden können. Wir können eine asynchrone Aufgabe verwenden, um unsere Suche vom Hauptfaden fernzuhalten.
Hier ist eine grobe Vorstellung davon, was getan werden muss:
%Vor% Sie sollten doppelte Datensätze entfernen, bevor Sie sie in der Datenbank speichern. Durch die Verwendung von HashSet
und das Erstellen eines Personenobjekts mit den Methoden equals()
und hashCode()
wird das Problem mit doppelten Datensätzen gelöst. Die Telefonnummer ist ein eindeutiger Wert. Wenn die Telefonnummern mit denen anderer übereinstimmen, sollten Sie nur eine davon speichern. Das bedeutet, dass Sie equals()
und hashCode()
Methoden von Person
-Objekt überschreiben sollten, indem Sie nur phone
field verwenden.
Testen:
%Vor%Drucke:
[Person [Name = Joe, Telefon = + 199999, IsFav = Falsch], Person [Name = Jessie, Telefon = + 133333, IsFav = Falsch]]
HashSet hat Person
Objekte, die eindeutige Telefonnummern haben. Johnny hat dieselbe Telefonnummer wie Joe, also lehnt HashSet
ab, um Johnny in die Liste aufzunehmen.
Auch das Hinzufügen von CallBack
method auf putPerson()
hilft Ihnen bei der fehlgeschlagenen Pinning-Operation.
Dies ist aus der Bolzen-Dokumentation.
Aufgaben in einer Serie
Aufgaben sind praktisch, wenn Sie eine Reihe von Aufgaben in einer Reihe ausführen möchten, wobei jede auf das Ende des vorherigen wartet. Stellen Sie sich beispielsweise vor, Sie möchten alle Kommentare in Ihrem Blog löschen.
%Vor%So ist es gemacht. Wenn Sie genau wissen wollen, was genau vor sich geht, sollten Sie die Dokumentation lesen, auch wenn sie ziemlich einfach aussieht:)
Tags und Links java android parse.com local-datastore bolts-framework