私のアプリでは、firebase上のデータベースの特定の要素に特定の名前の子があるかどうかを確認する必要があります。私はそれが次の線に沿って何かを使用することによって行われることを望みました:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
if (rootRef.childExists("name")) {
//run some code
}
検索しましたが、有用なものが見つかりませんでした。
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)
このようにしないでください
決して
それはすべてのデータを取り、デバイスにもたらします
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")
と組み合わせて使用してみてください
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) {
}
});
Snapshot.exists()を使用して、子の値に関係なく、参照されているデータベースエントリに子が含まれているかどうかを確認します。