web-dev-qa-db-ja.com

Google Firebaseは、子が存在するかどうかを確認します

私のアプリでは、firebase上のデータベースの特定の要素に特定の名前の子があるかどうかを確認する必要があります。私はそれが次の線に沿って何かを使用することによって行われることを望みました:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();

if (rootRef.childExists("name")) {
    //run some code
}

検索しましたが、有用なものが見つかりませんでした。

32
zomnombom

Edit 2; データが存在するかどうかを確認するためだけに、このスナップショットですべてのデータを実際にダウンロードしていることに言及する価値があると思います。ここで注意する必要があります。参照が巨大な場合(例:実際には特定の子/プロパティではなくルート参照)、存在を確認するために使用できるより深いノードを見つけるか、データを設計する必要があります構造が異なるため、効率的なチェックが可能です。

データベース参照は、事実上そのデータのURLです。実際にgetデータを取得して、子が存在するかどうかを確認します。これが、探している方法が DataSnapshot にある理由です。

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  void onDataChange(DataSnapshot snapshot) {
    if (snapshot.hasChild("name")) {
      // run some code
    }
  }
});

さて、このデザインパターンは少し奇妙に感じます。 「名前」が存在するかどうかを確認するためだけにデータベース全体を読んでいます。 rootRef.child("name")をリッスンし、snapshot.exists()かどうかをチェックするだけで、これをもう少し効率的にすることができます。

ここでvalidationを行い、フローを制御しようとしない場合、このコードをrules.jsonに入れることを検討する必要があります。

edit:元々間違った関数名を使用しました(hasChildの代わりにchildExists)

64
Thomas Bouldin

このようにしないでください

決して

それはすべてのデータを取り、デバイスにもたらします

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  void onDataChange(DataSnapshot snapshot) {
    if (snapshot.hasChild("name")) {
      // run some code
    }
  }
});

この方法で確認してください。存在する場合は子の値を返し、そうでない場合は-> null

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("childName")
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  void onDataChange(DataSnapshot snapshot) {
    if (snapshot.getValue() == null) {
      // The child doesn't exist
    }
  }
});

.childexists.equalTo("Your specific name")と組み合わせて使用​​してみてください

2
Rahul Shah
UsersRef = FirebaseDatabase.getInstance().getReference();   
Users.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot snapshot) {
                                    if (snapshot.hasChild("childName")) {

                                        // it exists!
                                    }else{
                                       // does not exist
                                    }
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {

                                }
                            });
0
Arjun

Snapshot.exists()を使用して、子の値に関係なく、参照されているデータベースエントリに子が含まれているかどうかを確認します。

0
John yepthomi