我想从firebase数据库中读取特定数据。我目前正在做的是这里。
public void writeToDBProfiles(Object data,String phoneNo) {
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference myRef = database.child("profiles/" + phoneNo);
myRef.setValue(data);
}
写入DB的方法
{{1}}
但它返回null ...任何帮助都将受到赞赏。
答案 0 :(得分:13)
如果您想使用电话号码获取特定数据,则可以使用此类查询
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());
}
});
我认为这是最好的方法。
答案 1 :(得分:2)
好的,我把它整理好了。问题中的上述代码完全正常,应该可行。 我正在为后来的用户解释,因为我犯了错误,可能会遇到同样的问题。
singleSnapshot.getValue(User.class);无法将结果强制转换为用户类,因为在上传数据时,即在setValue中我有我的 photoUrl等于null,因此您可以看到我的子节点中没有photoUrl。所以我认为(也许有人想要纠正我)我的singleSnapshot.getValue方法无法转换结果。
所以现在我已经从我的User类中省略了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
}
答案 2 :(得分:0)
<强>更新:强>
更新代码中的错误在此处。
myRef.setValue(data);
如果您要将数据添加为myRef.setValue(数据),那么您需要准确指定哪个孩子获取数据,或如果您想要更新所有孩子立刻然后你需要使用HashMap()和updateChildren()方法进行原子数据更新。
因此,对于特定的子更新,正确的方法是:
myRef.child("name").setValue(data);
我建议您阅读此official firebase blog以了解如何使用HashMap()一次性更新所有孩子。
如果有任何改变,请告诉我。
答案 3 :(得分:0)
在给出你的firebase数据库的位置时,你应该总是在引号中使用那个文件夹名,使用 DatabaseReference myRef = database.child(&#34; profiles&#34;);
而不是 DatabaseReference myRef = database.child(&#34; profiles /&#34;);