Auto-Inkrement-Wert in Feuerstellung
Wie kann ich die auto-Inkrement-Wert, gespeichert in der Feuerstellung aus einem Android client?
Derzeit: ich erkläre int id = 1
. Wenn ich erhöhen, ich sehe die Werte 2, 3 usw. gespeichert werden. Das ist in Ordnung, aber wenn ich re-führen Sie das Projekt, id
gesetzt ist gleich wieder auf 1.
Ich will es verhält sich wie eine statische variable, so kann ich erstellen Sie eine id, die gehen von 1 bis unendlich, ohne zurücksetzen.
AKTUALISIERT FEHLGESCHLAGEN
Ich Folgendes zum bestehen der FB-Referenz und eine string an die Funktion incrementCounter.
if(language_chosen.equalsIgnoreCase("english"))
{
Firebase publRef = f.child("Language").child("English").child("Message");
Firebase newPublRef = publRef.push();
writeMsgActivity demo = new writeMsgActivity();
demo.incrementCounter(newPublRef,the_msg_enter);
}
Nun ich versuche es mal mit der übergebenen Referenz und string an public void incrementCounter(Firebase publref,String my_msg)
in der oncomplete-Methode, aber es gibt mir eine Fehlermeldung.
public void incrementCounter(Firebase publref,String my_msg) {
publref.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(final MutableData currentData) {
if (currentData.getValue() == null) {
currentData.setValue(1);
} else {
currentData.setValue((Long) currentData.getValue() + 1);
}
return Transaction.success(currentData);
}
public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
if (firebaseError != null) {
System.out.println("Firebase counter increment failed.");
} else {
System.out.println("Firebase counter increment succeeded.");
Map<String, Object> publ = new HashMap<String, Object>();
publ.put("pubMsg", my_msg);
publ.put("id",currentData);
publref.setValue(publ);
}
}
});
}
AKTUALISIERT GELÖST
final Firebase upvoteref = new Firebase("https://shareurday.firebaseio.com/Message/"+msg_id+"/upvotes");
upvoteref.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(final MutableData currentData) {
if (currentData.getValue() == null) {
currentData.setValue(1);
} else {
currentData.setValue((Long) currentData.getValue() + 1);
}
return Transaction.success(currentData);
}
public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
if (firebaseError != null) {
System.out.println("Firebase counter increment failed.");
} else {
System.out.println("Firebase counter increment succeeded.");
}
}
});
Die variable msg_id ist die zufällig generierte id von push.
- Ich bin nicht sicher über das, was code, den Sie verwenden, mit FB und neu Laden, was bedeutet das hier ?. Aber wenn Sie an derselben Funktion (die Satz-id=1) auf neu laden, erhalten Sie id-1. Sie haben, um die Satz-id in einer Datei/Datenbank Und aktualisieren in diesem Speicher.
- Ich kann es in der Datenbank aber jedes mal wenn ich neu das Programm ausführen, es setzt den integer-id=1
- Auf jeder ausführen, die Sie brauchen, um zu überprüfen Existenz in der Datei/db... INSERT WENN NICHT VORHANDEN, SONST AKTUALISIEREN . ur Q scheint generische, aber ja u brauchen, um zu verfolgen alle gleichzeitigen änderungen, wenn das Objekt/Datensatz geteilt wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Beispiel für die Methode, die Schritten einem einzigen Zähler. Die zentrale Idee ist, dass Sie entweder den Eintrag (Einstellung gleich 1) oder mutierend den vorhandenen Eintrag. Mithilfe einer Transaktion hier wird sichergestellt, dass, wenn mehrere clients versuchen, erhöhen Sie den Zähler in der gleichen Zeit, alle Anfragen letztendlich erfolgreich. Von der FB-Dokumentation (Hervorhebung von mir):
push
ist, wird er automatisch mit einer eindeutigen Kennung erzeugt und würde nicht erfordern, dass Sie manuell Inkrementieren eines Zählers. Siehe z.B. firebase.com/docs/android/guide/saving-data.html#section-push . Lassen Sie mich wissen, wenn, dass wäre eine bessere Lösung für Sie.push
und rufen danngetKey
auf das Ergebnis, wie beschrieben in dem link, den ich oben gepostet, ist wahrscheinlich die richtige Lösung für Sie? Wenn dem so ist, werde ich meine Antwort, um dies zu reflektieren.publref.setValue(publ);
. Ist das denn eigentlich seinnewPublRef.setValue(publ);
?incrementCounter(Firebase publref,String my_msg)
publ.put("pubMsg", my_msg); publ.put("id",currentData);
mit der einzigen Zeilepubl.put(currentData, my_msg);
, aber es ist schwer zu sagen, weil Sie nicht angibt, auf welche Weise Ihre derzeitige Lösung nicht richtig funktioniert...publ.put("pubMsg", my_msg); publ.put("id",currentData);
außer für my_msg. Weil es übergeben wurdethe_msg_enter
? Ist es ein leerer String? Ich sehe es nicht vergeben werden, überall.incrementCounter(Firebase publref,String my_msg)
hierincrementCounter(Firebase publref,String my_msg)
nach bestandener möchte ich den übergebenen Variablen, aber publ.put("pubMsg", my_msg); und publref.setValue(Hrsg.); Sie funktionieren nicht in der inneren Methoden der oncompleted.public void incrementCounter(final Firebase publref, final String my_msg) {
. Ihre IDE-Warnung wahrscheinlich angegeben wurde, den entsprechenden fix.final Firebase f = new Firebase("https://shareurday.firebaseio.com/msg");
es speichert wie diesemsg:1
das ist nicht das, was ich will. Ich will es speichern in den map-Objekt, so wie diesmsg --> id:1
und es stürzte mein Programm nach ausführen.publ.put(currentData, my_msg);
wie ich bereits erwähnt?