Java Firebase获取值并更改/更新它
我以前问过几乎相同的问题。但答案不是那么好,或者说还不够好。我想重新开始,现在我有很多问题 这是邮局 所以现在我有另一个想法 这一次只有一个计算投票数的值,但应用程序没有得到“count”值的实际数量 这是我的密码:Java Firebase获取值并更改/更新它,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我以前问过几乎相同的问题。但答案不是那么好,或者说还不够好。我想重新开始,现在我有很多问题 这是邮局 所以现在我有另一个想法 这一次只有一个计算投票数的值,但应用程序没有得到“count”值的实际数量 这是我的密码: database = FirebaseDatabase.getInstance(); names= database.getReference("Test"); final Name name = new Name(txtName.getText().toS
database = FirebaseDatabase.getInstance();
names= database.getReference("Test");
final Name name = new Name(txtName.getText().toString(), score);
names.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
if (dataSnapshot.child(name.getName()).exists()) {
up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
names.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
score = dataSnapshot.child("Test").child("Name").getValue(long.class);
score += 1;
final Name name = new Name(txtName.getText().toString(), score);
try {
names.child(name.getName()).setValue(name);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Toast.makeText(Result.this, "Thank you for voting", Toast.LENGTH_SHORT).show();
Intent homeIntent3 = new Intent(Result.this, StartActivity.class);
startActivity(homeIntent3);
}
});
这是数据库
因此,如果这个名字不存在,我可以很容易地用score=1或score=-1添加上/下投票
但如果名称存在,则更改分数值时会出现问题
应用程序正在崩溃,出现以下错误
java.lang.NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' on a null object reference
at user.prof.name.Activities.Result$1$1$1.onDataChange(Result.java:80)
at com.google.firebase.database.obfuscated.zzap.zza(com.google.firebase:firebase-database@@16.0.3:75)
at com.google.firebase.database.obfuscated.zzca.zza(com.google.firebase:firebase-database@@16.0.3:63)
at com.google.firebase.database.obfuscated.zzcd$1.run(com.google.firebase:firebase-database@@16.0.3:55)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:251)
at android.app.ActivityThread.main(ActivityThread.java:6589)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
这是代码中的错误行
score = dataSnapshot.child("Test").child("Name").getValue(long.class);
我不是数据库编程方面的专家,但有什么问题吗?
错孩子了
我还尝试将“score”保存为字符串,并将其解析为长值。但是这也不起作用。你没有得到任何东西,因为你的
name
属性的名称在每个子对象中都是不同的。要解决此问题,您应该在每个子项下使用相同的名称,如下所示:
Firebase-root
|
--- test
|
--- Name1
| |
| --- name: "Name1"
| |
| --- score: 0
|
--- Name2
|
--- name: "Name2"
|
--- score: 15
请参见,name
属性的名称现在始终是name
和notname1和name2,依此类推
要获取所有对象中的分数属性值,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("test").orderByChild("name");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
long score = ds.child("score").getValue(Long.class);
Log.d(TAG, "Score: " + score);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
query.addListenerForSingleValueEvent(valueEventListener);
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Map<String, Object> map = new HashMap<>();
map.put("score", 5);
rootRef.child("test").child("Name1").updateChildren(map);
logcat中的输出将为:
Score: 0
Score: 15
还请注意,我传递给了getValue(Long.class)
,Long
类,而不是原语Long
编辑:
要编辑单个条目,则应使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("test").orderByChild("name");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
long score = ds.child("score").getValue(Long.class);
Log.d(TAG, "Score: " + score);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
query.addListenerForSingleValueEvent(valueEventListener);
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Map<String, Object> map = new HashMap<>();
map.put("score", 5);
rootRef.child("test").child("Name1").updateChildren(map);
DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference();
Map Map=newhashmap();
地图放置(“分数”,5);
rootRef.child(“test”).child(“Name1”).updateChildren(map);
第一个对象中的score
属性将从0
更改为5
。如果您认为您的score
属性将在多用户环境中更新,那么您应该使用我在中解释的答案,我看到的第一件事是Name
本身不是一个属性,而且您还有一个单独的节点用于存储实际值。我会这样做:score=dataSnapshot.child(“Test”).child(“Name1”).child(“Name1”).getValue(String.class)代码>谢谢。但我也有同样的错误谢谢你,亚历克斯·马莫。我得到了整个列表,我可以增加所有列表并更改分数值,但如何只编辑一个条目?我不明白。。。那么,如果Name1已经存在,我如何只增加该条目?我试过一些方法,但没有效果…对不起。不幸的是,这个问题尚未得到100%的回答。如果我现在接受答案,那么不幸的是,没有人再帮助我了。我已经编辑了我对你答案的第一个答案。我看到了编辑后的评论。所以,如果你想编辑一个条目,请查看我的更新答案。现在可以了吗?非常感谢!这是正确的方法。我只有两个错误。如何获得分数的实际值?如果我在添加分数--;地图放置(“计数”,分数)代码>然后它总是从0开始并向下计数1。当我添加score++代码>它计数无限高。一个for循环,听到它也算是无限好,欢迎你,汉斯!“我怎样才能得到分数的实际值?”你应该发布另一个新的问题,这样我和其他用户可以帮助你。