Firebase“无法将java.util.HashMap类型的值转换为int”

时间:2016-08-09 08:20:04

标签: android firebase firebase-realtime-database

OnDataChange()中的ValueEvenListener方法的代码的这一行:

int latest = dataSnapshot.getValue(Integer.class);

我收到错误为DatabaseException的{​​{1}}。

但是,在我的数据库中,您可以查看下图:

enter image description here

显然不是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();
            }
        });

3 个答案:

答案 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