Java 在Firebase中自动增加值
如何从Android客户端自动增加Firebase中存储的值 当前:我声明Java 在Firebase中自动增加值,java,android,firebase,firebase-realtime-database,auto-increment,Java,Android,Firebase,Firebase Realtime Database,Auto Increment,如何从Android客户端自动增加Firebase中存储的值 当前:我声明intid=1。当我递增时,我看到值2、3等被存储。这很好,但是当我重新运行项目时,id再次设置为1 我希望它的行为像一个静态变量,所以我可以创建一个id,它将从1变为无穷大,而无需重置 更新失败 final Firebase upvoteref = new Firebase("https://shareurday.firebaseio.com/Message/"+msg_id+"/upvo
intid=1
。当我递增时,我看到值2、3等被存储。这很好,但是当我重新运行项目时,id
再次设置为1
我希望它的行为像一个静态变量,所以我可以创建一个id,它将从1变为无穷大,而无需重置
更新失败
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.");
}
}
});
我使用以下命令将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);
}
}
});
}
变量msg_id是push随机生成的id。下面是一个增加单个计数器的示例方法。关键的想法是,要么创建条目(将其设置为1),要么修改现有条目。在这里使用事务可以确保如果多个客户端同时尝试递增计数器,所有请求最终都会成功。从Firebase文档(重点矿山)中: 处理可能被并发更新损坏的复杂数据时,请使用我们的事务功能
firestore中添加了一个新功能以自动增加值。简单到
document("fitness_teams/Team_1").
updateData(["step_counter" : FieldValue.increment(500)])
参考链接:
在我的项目中使用以下代码
var firestore = Firestore.instance;
firestore.collection('student').document('attendance').updateData({'total_attendace': FieldValue.increment(1)});
我不确定您在Firebase中使用的代码是什么,以及重新加载在这里意味着什么?。但如果在重新加载时调用相同的函数(将id设置为1),则会得到id 1。您必须在某些文件/数据库中设置id,并在该存储中不断更新。我可以在数据库中设置id,但每次重新运行程序时,它都会重置为整数id=1,每次运行时,您都需要检查文件/数据库中是否存在。。。如果不存在则插入,否则更新。ur Q似乎是通用的,但如果对象/记录是共享的,您需要跟踪所有并发更改。您能告诉我如何传入变量吗?我对此不太在行。您到底想实现什么?如果使用
push
保存数据,它将自动生成一个唯一的id,并且不需要手动增加计数器。见例。让我知道这对你来说是否是一个更好的解决方案。我需要为每封邮件创建一个id,这样我就可以在回复中与另一棵树进行比较。(我已经完成了这一部分)例如,每个消息都有一个id,对此消息的每个回复都将使用该消息的id。因此,当我检索回复时,它将位于消息id内。您是否尝试了publil.put(currentData,my_msg)代码>正如我之前指出的那样?很抱歉这么麻烦,我已经开始工作了,我将上传解决方案。它正盯着我的脸。非常感谢你的帮助!!!
var firestore = Firestore.instance;
firestore.collection('student').document('attendance').updateData({'total_attendace': FieldValue.increment(1)});