在OnDataChange()
中的ValueEvenListener
方法的代码的这一行:
int latest = dataSnapshot.getValue(Integer.class);
我收到错误为DatabaseException
的{{1}}。
但是,在我的数据库中,您可以查看下图:
显然不是Failed to convert a value of type java.util.HashMap to int
而是HashMap
。这是一个错误还是我做错了什么?我该怎么办才能修复它?为什么在值int
时检索Hashmap
?
完整数据快照:
int
数据库:
final DatabaseReference database = FirebaseDatabase.getInstance().getReference();
database.child("Campaigns").child(key).child("count");
database.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int latest = dataSnapshot.getValue(Integer.class);
button.setText(latest + "");
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(context, context.getString(R.string.error) + ": " + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
答案 0 :(得分:5)
事实证明我必须再次将子dataSnapshot发送到我的目的地。 E.g:
int latest = dataSnapshot.child("Campaigns").child(key).child("count").getValue(Integer.class);
默认情况下,dataSnapshot
实际上是我的整个数据库。
答案 1 :(得分:3)
您的ValueEventListener
已附加到整个数据库。
// This line gets a reference to the whole database
final DatabaseReference database = FirebaseDatabase.getInstance().getReference();
// This line creates a child DatabaseReference, but you don't assign
// the child to a variable
database.child("Campaigns").child(key).child("count");
// This line adds a ValueEventListener to the whole database
database.addValueEventListener(new ValueEventListener() {
你想要的是:
final DatabaseReference database = FirebaseDatabase.getInstance().getReference()
final DatabaseReference countRef = database.child("Campaigns").child(key).child("count")
countRef.addValueEventListener(new ValueEventListener() {
// ...
});
您可以看到,在后一个示例中,ValueEventListener附加到子引用,而不是根目录。
答案 2 :(得分:2)
如果我们假设dataSnapshot是正确的,这应该有效。
final DatabaseReference database = FirebaseDatabase.getInstance().getReference();
database = database.child("Campaigns").child(key).child("count"); // replaced
database.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int latest = Integer.valueOf(dataSnapshot.getValue().toString()); // replaced
button.setText(latest + "");
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(context, context.getString(R.string.error) + ": " + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
提醒:每当dataSnapshot发生更改时, addValueEventListener 都会运行。 如果您只想运行一次,请使用 addListenerForSingleValueEvent 。