在 Firebase 中自动增加一个值
Auto-increment a value in Firebase
如何从 Android 客户端自动递增存储在 Firebase 中的值?
目前:我声明int id = 1
。当我递增时,我看到存储了值 2、3 等。很好,但是当我重新 运行 项目时,id
再次设置为等于 1。
我希望它的行为像一个静态变量,所以我可以创建一个从 1 到无穷大的 id,而无需重新设置。
更新失败
我使用以下代码将 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);
}
现在我尝试在 oncomplete 方法中使用 public void incrementCounter(Firebase publref,String my_msg)
处传递的引用和字符串,但它给了我一个错误。
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随机生成的id
这是一个递增单个计数器的示例方法。关键思想是您正在创建条目(将其设置为等于 1)或 mutating 现有条目。在此处使用事务可确保如果多个客户端同时尝试增加计数器,所有请求最终都会成功。来自 Firebase 文档(强调我的):
Use our transactions feature when working with complex data that could be corrupted by concurrent updates
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)])
参考link:
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)});
如何从 Android 客户端自动递增存储在 Firebase 中的值?
目前:我声明int id = 1
。当我递增时,我看到存储了值 2、3 等。很好,但是当我重新 运行 项目时,id
再次设置为等于 1。
我希望它的行为像一个静态变量,所以我可以创建一个从 1 到无穷大的 id,而无需重新设置。
更新失败
我使用以下代码将 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);
}
现在我尝试在 oncomplete 方法中使用 public void incrementCounter(Firebase publref,String my_msg)
处传递的引用和字符串,但它给了我一个错误。
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随机生成的id
这是一个递增单个计数器的示例方法。关键思想是您正在创建条目(将其设置为等于 1)或 mutating 现有条目。在此处使用事务可确保如果多个客户端同时尝试增加计数器,所有请求最终都会成功。来自 Firebase 文档(强调我的):
Use our transactions feature when working with complex data that could be corrupted by concurrent updates
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)])
参考link: 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)});