我有一个聊天应用程序的数据库结构,所以我在数据库中有一个消息节点,如下所示
消息是一个密钥的父级,包含两个用户聊天的UID,这个密钥包含聊天主体的值,到目前为止,应用程序正在按照我的意愿推送数据时非常好。
但是当尝试读取数据时,DataSnapShot对象始终拥有节点的最后一个叶子,意味着该键的子节点。我尝试了不同的方法来获取自己的密钥来迭代并获得其值的列表而没有运气。
我试过的方法
public static final String MESSAGES_NODE_DB = "messages";
mMessageDbRef = FirebaseDatabase.getInstance().getReference()
.child(MESSAGES_NODE_DB).child(keyUserA + "-" + KeyUserB);
mMessageDbRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Timber.d("parent key " + dataSnapshot.getKey());
for (DataSnapshot singleSnap : dataSnapshot.getChildren()) {
Message message = singleSnap.getValue(Message.class);
messageList.add(message);
instantiateRecyclerView();
}
}
此方法总是会导致错误无法转换
类型的对象java.lang.String中
父键打印L91eMRVq_nx6WHUzZFo
另一个
mMessageDbRef = FirebaseDatabase.getInstance().getReference().child("messages");
for (DataSnapshot singleSnap : dataSnapshot.getChildren()) {
Timber.d("keys" + singleSnap.getKey());
}
}
输出为L91eMRVq_nx6WHUzZFo
我想要实现的目标
要将消息节点内的键列表检索为
vXgRtbjqhUYPOLyjhmGKRzITUC83-24L0kQx75fhoz06YpXnWRheETct2
答案 0 :(得分:1)
在onChildAdded方法中,不使用getChildren()和for循环方法,因为onChildAdded方法返回mMessageDbRef引用下面的各个节点。基本上,onChildAdded中的数据快照参数可以直接转换为Message对象。
因此,直接将数据快照值分配给消息对象,而不使用任何循环或getChildren方法。
通过执行此操作,您将可以通过消息对象变量访问消息的值。
这样的事情:
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Message message = dataSnapshot.getValue(Message.class);
messageList.add(message);
instantiateRecyclerView();
}
}
答案 1 :(得分:1)
检索messages
节点内的密钥:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("messages").child(keyUserA + "-" + KeyUserB);
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
String keys=datas.getKey();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
数据快照在child(keyUserA + "-" + KeyUserB);
上,然后您在randomid L91eMRVq_nx6WHUzZFo
内进行迭代,您将能够使用getKey()