Android 从Firebase数据库读取数据

Android 从Firebase数据库读取数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想从firebase数据库读取特定数据。我现在做的就是在这里 DatabaseReference database = FirebaseDatabase.getInstance().getReference(); DatabaseReference myRef = database.child("profiles/"); myRef.child(phoneNo).addListenerForSingleValueEvent(new ValueEventListener() { @Ov

我想从firebase数据库读取特定数据。我现在做的就是在这里

DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference myRef = database.child("profiles/");

myRef.child(phoneNo).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        user = dataSnapshot.getValue(User.class);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}

});

方法写入数据库

public void writeToDBProfiles(Object data,String phoneNo) {
    DatabaseReference database = FirebaseDatabase.getInstance().getReference();
    DatabaseReference myRef = database.child("profiles/" + phoneNo);
    myRef.setValue(data);
}

但它返回空值。。。任何帮助都将不胜感激。

更新:

更新代码中的错误在这里

如果要将数据添加为myRef.setValue(data),则需要准确指定哪个子级正在获取数据,或者如果要立即更新所有子级,则需要使用HashMap()和updateChildren()方法进行原子数据更新。

因此,对于特定的子更新,正确的方法如下:

myRef.child("name").setValue(data);
我鼓励您阅读本文,了解如何使用HashMap()一次性更新所有子项


如果它对您有任何改变,请务必告诉我。

在给出您的firebase数据库位置时,您应始终使用该文件夹名称的倒逗号,使用 DatabaseReference myRef=database.child(“profiles”)

而不是
DatabaseReference myRef=database.child(“profiles/”)

如果您想使用电话号码获取特定数据,则可以使用如下查询

DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = database.child("profiles");

Query phoneQuery = ref.orderByChild(phoneNo).equalTo("+923336091371");
phoneQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
           user = singleSnapshot.getValue(User.class); 
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e(TAG, "onCancelled", databaseError.toException());
    }
});

我认为这是最好的方法。

好的,我把它整理好了。问题中的上述代码非常好,应该可以正常工作。 我向后来的用户解释,他们可能会因为我犯的错误而有同样的问题

singleSnapshot.getValue(User.class);无法将结果强制转换为用户类,因为在上载数据时,即在setValue中,我的 photoUrl等于null,因此您可以看到photoUrl不存在于我的子节点中。所以我相信(也许有人想纠正我的错误)我的singleSnapshot.getValue方法无法转换结果

所以现在我已经从我的用户类中省略了photoUrl,当我开始使用相关模块时,我会回到它

再次感谢大家的建议和帮助

public class User {
String name;
Uri photoURL;
String bloodGroup;
String city;
String country;
double latitude;
double longitude;
boolean availableToDonate;

// Get, set and constructors are obvious here I am just saving some space in the post
}

我刚刚更新了我如何向DB写信的问题。实际上/告诉节点在profiles节点内。您的数据是什么。。您正在更新所有子项还是某些特定的内容?在更新部分,我使用setValue更新特定的子项。但问题是我无法从firebase查询特定数据。@Muhammadhassaniazi检查更新的答案是否可以解决问题。有关子项的特定更新,您是否具有数据的读取权限?参见@FrankvanPuffelen他共享的快照顶部有默认的安全规则横幅,这不意味着他的.write和.read都是auth!=无效的在这种情况下,如果他能写,那么他也应该能够阅读,因为用户是授权的,不是吗?如果我错了,请纠正我。我错过了那个横幅,但它确实应该。最可能的问题是用户没有经过身份验证。如果在
onCancelled()
中添加一个简单的
抛出databaseError.toException()
,并在
setValue()中添加一个完成侦听器,则最容易发现的内容。两者都记录在我链接的页面上。@FrankvanPuffelen我有权限。好的。这开始感觉有点像交互式调试,StackOverflow不适合这种情况。您是否可以用硬编码的值而不是
phoneNo
重现问题?你能用一个只有一个属性的
User
类来重现它吗?你能和我一起上这门课吗?另外,请幽默我,将错误处理代码放入
onCancelled()
和对
setValue()
的调用中。只有在数据更新时才会调用addListenerForSingleValueEvent。但是如果我只想在现有数据没有变化的情况下读取数据呢???我有一个要求,我只需要从一个键读取一些值,但是对于侦听器,当没有更新发生时,我无法读取它。回答不好。
public class User {
String name;
Uri photoURL;
String bloodGroup;
String city;
String country;
double latitude;
double longitude;
boolean availableToDonate;

// Get, set and constructors are obvious here I am just saving some space in the post
}