我想在指定的情况下,获取根节点名。弟子 值存在于节点内。
例如。 考虑以下结构
-Likes
-uid1
-postid1
-myid
-othersid1
-othersid2
-postid2
-othersid1
-othersid2
-uid2
-postid3
-myid
-othersid2
我想得到 uid1 和 帖子编号1 根名称,如果 弟子 值存在于节点内部。同样,得到 uid2 和 帖子编号3 根名称,如果 弟子 存在于该节点内。
我是这样写的。
public void checkNode()
{
DatabaseReference reference=FirebaseDatabase.getInstance().getReference().child("Likes");
reference.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds1: dataSnapshot.getChildren())
for(DataSnapshot ds2: ds1.getChildren())
if(ds2.hasChild("myid"))
Log.i("app","present inside: "+ds1.getKey()+" > "+ds2.getKey());
}
public void onCancelled( DatabaseError databaseError) {
}
});
}
这段代码可以正常工作。但使用嵌套for循环是否有效?如果不高效,我如何更有效地写这段代码?
FirebaseDatabase.getInstance().getReference("/Likes/").orderByChild("myid").equalTo("some value").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
/**
* -Likes
* -uid1
* -postid1
* -myid
*/
//You are at myid ref
//get postid reference like below
DatabaseReference postIdRef = dataSnapshot.getRef().getParent();
//uidRef
DatabaseReference uidRef = postIdRef.getParent();
//likesRef
DatabaseReference likesRef = uidRef.getParent();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
一旦你的代码打到了代码块的 onDataChanged(DataSnapshot snapshot)
你可以使用snapshot,然后调用 getRef()
然后 getParent()
方法
一旦你得到了父节点的参考,你就可以用它来在树上遍历,并使用 getChilderen()
一旦你的代码进入了 onDataChanged(DataSnapshot snapshot)
你可以使用snapshot,然后调用 getRef()
然后 getParent()
方法
一旦你得到了父节点的参考,你就可以用它来在树上遍历,并使用 getChilderen()
唯一需要注意的是,你的FirebaseUser应该有读取这个父节点的权限,否则你会得到一个异常。