我正在研究fire base并成功将数据推送到服务器,并能够使用模型类将数据保存到数据库中。我的数据库结构看起来像。
检索数据:
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference mref = firebaseDatabase.getReference();
mref.orderByChild("jetbro").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
Log.d("User val", child.getValue(UserModel.class).getName());// Null Pointer
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
更新代码:
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference mref = firebaseDatabase.getReference();
mref.orderByChild("jetbro").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d("User val", dataSnapshot.getValue(UserModel.class).getName());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
但它给了我空指针异常。以前有人可以吗?
提前帮助将不胜感激!
答案 0 :(得分:0)
首先,如果您想从random key
内部获取孩子,则应使用addChildEventValueListerner
代替addListenerForSingleValueEvent
,因为它会给出直接值,即random key
作为孩子,而addChildEventValueListerner
逐个为jetbro
节点的孩子提供。
如果你认为我只是想一次性使用它addChildEventValueListerner
,只会在添加,更改,删除时提供数据
mRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d("User val",datasnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 1 :(得分:0)
class DataModel{
String message,timeStamp;
DataModel(String message, String timeStamp){
this.message = message;
this.timeStamp = timeStamp;
}
DataModel(){
}
}
制作如上所述的数据模型(确保firebase数据库中的键名和数据模型中的变量具有相同的名称)
使用ChildEventListener检索带有Reference的数据
mRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
DataModel data = dataSnapshot.getValue(DataModel.class);
//here you can now access your message and timestamp data
data.message
data.timeStamp
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我不知道userModel
中Firebase
节点中的内容是什么,但您必须为DataModel
本身的内容创建一个新的UserModel
类。
然后是Arraylist
课程中名为userModel
的{{1}}。
答案 2 :(得分:0)
最后我解决了问题:
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference mref = firebaseDatabase.getReference();
mref.child("jetbro").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
ChatModel chatModel = dataSnapshot.getValue(ChatModel.class);
UserModel usermodel = chatModel.getUserModel();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});