如果给定字符串是给定firebase位置的子字符串,而不下载firebase中的整个数据快照,我如何获得布尔值



如果给定的String是Firebase节点的子级,则我只需要获取true或false值,而不需要获取整个节点的整个DataSnapshot。这是为了降低Firebase实时下载的成本。

Firebase数据库结构

我尝试过的:

VillazRef.child(**UID2**).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
if (dataSnapshot.child(VISIBLE).hasChild("OMBsclV...0X6w2"))
{
bool=true;
}
if (dataSnapshot.child(INVISIBLE).hasChild("OMBsclV...0X6w2"))
{
bool=true;
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});

我认为这些cadesVillazRef.child(**UID2**).addListenerForSingleValueEvent返回了这个位置的整个数据快照,但我不希望这样,这完全是浪费我的带宽,所以我只需要像一样

if("OMBsclV...0X6w2" is within the VillazRef.child(**UID2**))
{
bool=true;
}
else
{
bool=false;
}

您就快到了。您所需要做的就是深入数据库层次结构。假设以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

将返回";cxhcK。。。kj433";作为登录用户的UID(UID2(;OMBsc。。。0X6w2";是";可见";节点,则请使用以下代码行:

String uidToSearch = "OMBsc ... 0X6w2";
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidToSearchRef = rootRef.child("Villaz")
.child(uid)
.child("visible")
.child(uidToSearch);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()) {
bool = true;
} else {
bool = false;
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
}
};
uidToSearchRef.addListenerForSingleValueEvent(valueEventListener);

通过这种方式,您只从数据库中下载一个值,并且而不是整个";可见";节点。然而,由于Firebase API是异步的;bool";不能简单地在";onDataChange(("方法为了能够在回调之外使用该值,请查看我在以下帖子中的回答:

  • 如何将DataSnapshot值作为方法的结果返回

最新更新