Ich verwende Parse.com
als Backend für meine App. Sie bieten auch eine lokale Datenbank zum Speichern von Informationen als Alternative zu SQLite
.Android: Wie synchronisiert man Abfragen mit Schrauben von Parse.com?
Ich möchte Nummern aus dem Telefon zu meiner Datenbank mit Parse 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 Nummern zu erhalten, die mit der Nummer ü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, dies zu tun ist:
public void putPerson(final String name, final String phoneNumber, final boolean isFav) {
// Verify if there is any person with the same phone number
ParseQuery<ParseObject> query = ParseQuery.getQuery(ParseClass.PERSON_CLASS);
query.whereEqualTo(ParseKey.PERSON_PHONE_NUMBER_KEY, phoneNumber);
query.fromLocalDatastore();
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> personList,
ParseException e) {
if (e == null) {
if (personList.isEmpty()) {
// If there is not any person with the same phone number add person
ParseObject person = new ParseObject(ParseClass.PERSON_CLASS);
person.put(ParseKey.PERSON_NAME_KEY, name);
person.put(ParseKey.PERSON_PHONE_NUMBER_KEY, phoneNumber);
person.put(ParseKey.PERSON_FAVORITE_KEY, isFav);
person.pinInBackground();
Log.d(TAG,"Person:"+phoneNumber+" was added.");
} else {
Log.d(TAG, "Warning: " + "Person with the number " + phoneNumber + " already exists.");
}
} else {
Log.d(TAG, "Error: " + e.getMessage());
}
}
}
);
}
Dann wurden 3 mal diese Methode nenne ich drei Zahlen addieren:
ParseLocalDataStore.getInstance().putPerson("Jack", "0741234567", false);
ParseLocalDataStore.getInstance().putPerson("John", "0747654321", false);
ParseLocalDataStore.getInstance().putPerson("Jack", "0741234567", false);
ParseLocalDataStore.getInstance().getPerson(); // Get all persons from database
Beachten Sie, dass die dritte Zahl die gleiche wie die erste, und Es sollte nicht zur Datenbank hinzugefügt werden. Aber die logcat
zeigt:
12-26 15:37:55.424 16408-16408/D/MGParseLocalDataStore: Person:0741234567 was added.
12-26 15:37:55.424 16408-16408/D/MGParseLocalDataStore: Person:0747654321 was added.
12-26 15:37:55.484 16408-16408/D/MGParseLocalDataStore: Person:0741234567 was added.
Die dritte Zahl hinzugefügt wurde, auch wenn es nicht tun sollte, weil fintInBackground()
fast gleichzeitig in 3 Hintergrund-Threads ausgeführt wird, so wird er feststellen, dass es keine Nummer in der Datenbank wie die, die ich hinzufügen möchte.
In this Frage ein Kerl sagte mir, dass ich Bolts
Bibliothek von Parse
verwenden sollte. Ich lese darüber aus here und einige Parse
Blog-Posts, aber ich verstehe nicht vollständig, wie man dies mit der Methode, die ich bereits habe, und wie man die nacheinander auszuführenden Abfragen syncronize.
Wenn jemand mit dieser Bibliothek gearbeitet bitte leite mich auf, wie dies zu tun oder einige grundlegende Beispiele geben, damit ich den Workflow verstehen.
Vielen Dank!
wenn Sie -Rückrufmethode in Ihre pinInBackground() fügen Sie die Zeile vervielfältigt Problem zu lösen. –
@SedatPolat Wie? Das Problem ist nicht mit PinInBackground(). Das Problem ist, dass alle 3 Abfragen fast gleichzeitig bearbeitet werden, wenn findInBackgroud() aufgerufen wird. Ich möchte diese Abfragen nacheinander bearbeiten. –
Wenn Sie CallBack zu pinInBackground() wie in meiner Antwort hinzufügen, warten Ihre Sicherungsvorgänge gegenseitig. –