我在Android应用中从Firebase恢复数据时遇到错误。
错误
我的代码:
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = databaseReference.child(path);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue(String.class);
ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
clipboard.setText(value);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
"路径" - 孩子的名字。
和我的
答案 0 :(得分:0)
您的代码会读取数据根目录中的所有数据。
因此,dataSnapshot
传递给onDataChange
的内容是:
{
"uzmtn": "data"
}
然后在其上调用dataSnapshot.getValue(String.class)
,这是不可能的:快照中的值不是字符串。
有两个简单的选项可以解决它:
我将从第二个开始,因为它最接近你的代码。
由于您已经在dataSnapshot
中获取了整个JSON,因此您可以使用DataSnapshot class的方法来查找所需的值。
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = databaseReference.child(path);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.child("uzmtn").getValue(String.class);
ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
clipboard.setText(value);
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
虽然这有效,但您阅读的数据略多于所需数据。这里并不算太糟糕,但作为一般情况:最好只读取您需要的精确数据。
为此,我们可以......
您可以直接将侦听器附加到uzmtn
节点,而不是侦听数据库的根目录:
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("uzmtn");
DatabaseReference ref = databaseReference.child(path);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue(String.class);
ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
clipboard.setText(value);
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
如果你这样做,dataSnapshot
将包含你正在寻找的字符串:
"data"
在快照中,对dataSnapshot.getValue(String.class)
的调用将起作用。
答案 1 :(得分:0)
您正在返回哈希图类型,因为未指定要返回的孩子。想象一下您的数据结构就像firebase数据库中的一棵树,每个节点都有自己的值。 您想要返回的是树中的子节点,但是,您返回的是节点本身,这将返回节点本身和整个子节点。
简单的解决方案是
dataSnapshot.child('emtz').getValue() .....