web-dev-qa-db-ja.com

firebaseデータベースの値が存在するかどうかを確認するにはどうすればよいですか?

GoogleのFirebaseでRealtime Databaseを使用していますが、子供が存在するかどうかを確認しようとしています。

私のデータベースは次のように構成されています

- / (root)
-   /users/
–-    /james/
--    /jake/
-   /rooms/
--    /room1/
---      (room 1 properties)
--    /room2/
---      (room 2 properties)

Room1が存在するかどうかを確認したいと思います。私は次を試しました:

let roomName:String = "room1"
roomsDB.child(roomName).observeSingleEventOfType(.Value) { 
(snap:FIRDataSnapshot) in
    let roomExists:Bool = snap.value != nil ? "TAKEN" : "NOT TAKEN"
 }

snap.valueにアクセスすると、そのルームのプロパティのJSONが返されますが、最初にルーム(/rooms/room1/)があるかどうかを確認するにはどうすればよいですか?

明確化が必要な場合はコメントする

35
Hidden14
self.ref = FIRDatabase.database().reference()

   ref.child("rooms").observeSingleEvent(of: .value, with: { (snapshot) in

        if snapshot.hasChild("room1"){

            print("true rooms exist")

        }else{

            print("false room doesn't exist")
        }


    })
68
ismael33

@ ismael33の答え は機能しますが、room1が存在するかどうかを確認するためにすべてのroomsをダウンロードします。

次のコードでも同じことが実現されますが、ダウンロードするのはrooms/room1のみです。

ref = FIRDatabase.database().reference()

ref.child("rooms/room1").observeSingleEvent(of: .value, with: { (snapshot) in
    if snapshot.exists(){
        print("true rooms exist")
    }else{
        print("false room doesn't exist")
    }
}) 
18

Firebaseを使用していくつかの提案があります。firebaseから確認してください。

exists()メソッドを使用して、DataSnapshot内の特定のキーの存在をテストできます。

DataSnapshotには、Firebaseデータベースの場所からのデータが含まれます。 Firebaseデータベースからデータを読み取るたびに、DataSnapshotとしてデータを受け取ります。

DataSnapshotは、on()またはonce()でアタッチするイベントコールバックに渡されます。 val()メソッドを呼び出すことにより、スナップショットの内容をJavaScriptオブジェクトとして抽出できます。または、child()を呼び出して子スナップショットを返すことにより、スナップショットに移動できます(その後、val()を呼び出すことができます)。

DataSnapshotは、データベースの場所にあるデータの効率的に生成された不変のコピーです。変更することはできず、変更されることはありません。データを変更するには、常にFirebase参照を直接使用します。

exists()-このDataSnapshotにデータが含まれている場合、trueを返します。スナップショットを使用するよりもわずかに効率的です。val() !== null.

Firebaseドキュメントの例(javascriptの例)

var ref = new Firebase("https://docs-examples.firebaseio.com/samplechat/users/fred");
ref.once("value", function(snapshot) {
  var a = snapshot.exists();
  // a === true

  var b = snapshot.child("rooms").exists();
  // b === true

  var c = snapshot.child("rooms/room1").exists();
  // c === true

  var d = snapshot.child("rooms/room0").exists();
  // d === false (because there is no "rooms/room0" child in the data snapshot)
}); 

また、これを参照してください ページ (すでに私のコメントで言及されています)

ここにJavaを使用した例があります。

Firebase userRef= new Firebase(USERS_LOCATION);
userRef.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        if (snapshot.getValue() !== null) {
            //user exists, do something
        } else {
            //user does not exist, do something else
        }
    }
    @Override
    public void onCancelled(FirebaseError arg0) {
    }
});

アイデアが得られたと思います。

7
Renjith V R

Snapshot.existsの値を確認できます。

NSString *roomId = @"room1";
FIRDatabaseReference *refUniqRoom = [[[[FIRDatabase database] reference]
                                      child:@"rooms"]
                                     child:roomId];

[refUniqRoom observeSingleEventOfType:FIRDataEventTypeValue
                            withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {

    bool isExists = snapshot.exists;
    NSLog(@"%d", isExists);
}];

それらのいずれかを使用してとてもシンプルで簡単...あなたが好きな方法

ValueEventListener responseListener = new ValueEventListener() {
    @Override    
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            // Do stuff        
        } else {
            // Do stuff        
        }
    }

    @Override    
    public void onCancelled(DatabaseError databaseError) {

    }
};

FirebaseUtil.getResponsesRef().child(postKey).addValueEventListener(responseListener);

function go() {
  var userId = Prompt('Username?', 'Guest');
  checkIfUserExists(userId);
}

var USERS_LOCATION = 'https://SampleChat.firebaseIO-demo.com/users';

function userExistsCallback(userId, exists) {
  if (exists) {
    alert('user ' + userId + ' exists!');
  } else {
    alert('user ' + userId + ' does not exist!');
  }
}

// Tests to see if /users/<userId> has any data. 
function checkIfUserExists(userId) {
  var usersRef = new Firebase(USERS_LOCATION);
  usersRef.child(userId).once('value', function(snapshot) {
    var exists = (snapshot.val() !== null);
    userExistsCallback(userId, exists);
  });
}

Firebase userRef= new Firebase(USERS_LOCATION);
userRef.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        if (snapshot.getValue() !== null) {
            //user exists, do something
        } else {
            //user does not exist, do something else
        }
    }
    @Override
    public void onCancelled(FirebaseError arg0) {
    }
});
0
Sohaib Aslam