Как мне автоматически увеличить значение, хранящееся в Firebase, из клиента Android?
В настоящее время: заявляю int id = 1
. Когда я увеличиваю, я вижу, что значения 2, 3 и т. Д. Сохраняются. Это нормально, но когда я повторно запускаю проект, id
снова устанавливается равным 1.
Я хочу, чтобы он вел себя как статическая переменная, поэтому я могу создать идентификатор, который будет идти от 1 до бесконечности без сброса.
ОБНОВЛЕНИЕ НЕ выполнено
Я использовал следующее, чтобы передать ссылку Firebase и строку в функцию 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);
}
Теперь я пытаюсь использовать переданную ссылку и строку в public void incrementCounter(Firebase publref,String my_msg)
в методе oncomplete, но это дает мне ошибку.
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);
}
}
});
}
ОБНОВЛЕНИЕ РЕШЕНО
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.");
}
}
});
Переменная msg_id - это случайно сгенерированный идентификатор от push.
2 ответа
Вот пример метода, который увеличивает один счетчик. Основная идея состоит в том, что вы либо создаете запись (устанавливая ее равной 1), либо изменяете существующую запись. Использование транзакции здесь гарантирует, что если несколько клиентов попытаются увеличить счетчик одновременно, все запросы в конечном итоге будут успешными. Из документации Firebase (выделено мной):
Используйте нашу функцию транзакций при работе со сложными данными, которые могут быть повреждены одновременными обновлениями
public void incrementCounter() {
firebase.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);
}
@Override
public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
if (firebaseError != null) {
Log.d("Firebase counter increment failed.");
} else {
Log.d("Firebase counter increment succeeded.");
}
}
});
}
В firestore добавлена новая функция для автоинкремента значений. Так просто как
document("fitness_teams/Team_1").
updateData(["step_counter" : FieldValue.increment(500)])
Ссылка: https://firebase.googleblog.com/2019/ 03 / increment-server-side-cloud-firestore.html
Используется ниже кода в моем проекте.
var firestore = Firestore.instance;
firestore.collection('student').document('attendance').updateData({'total_attendace': FieldValue.increment(1)});
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.