【问题标题】:How do I check if a firebase database value exists?如何检查 firebase 数据库值是否存在?
【发布时间】:2016-09-21 04:04:28
【问题描述】:

我正在将实时数据库与 Google 的 Firebase 一起使用,并且正在尝试检查是否存在孩子。

我的数据库结构如下

- / (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/) 是否开始?

如果需要任何说明,请发表评论

【问题讨论】:

标签: swift firebase firebase-realtime-database


【解决方案1】:
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")
        }


    })

【讨论】:

  • 此代码适用于 Firbase 3(最后一个 ... 2016 年 5 月)
  • 你也可以检查是否有任何房间有 haschildren() 如果它是 false ,它根本没有房间......
  • 如果您要检查的对象的父对象内部有很多数据怎么办?会全部下载吗?
  • 2017 年 5 月 17 日刚刚发布的 Firebase 4.0 怎么样!?
  • 虽然这个答案有效,但它会下载比需要更多的数据。使用ref.child("rooms/room1").observeSingleEvent(of: .value, with: { (snapshot) in if snapshot.exists(){ 减少从数据库读取的数据量。另请参阅我的替代答案:stackoverflow.com/a/50494190
【解决方案2】:

answer of @ismael33 工作时,它会下载所有rooms 以检查room1 是否存在。

下面的代码实现了相同的功能,但只下载了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")
    }
}) 

【讨论】:

  • 这种方式要好得多。除了不必下载所有数据之外,如果您对像我这样的规则有限制,您无法读取 room 对象的等效项,您可以沿着树走得更远,而不会导致检查它是否存在问题.
【解决方案3】:

我有一些关于使用 firebase 的建议。你可以从 firebase 中查看。

我们可以使用exists() 方法测试DataSnapshot 中某些键的存在:

DataSnapshot 包含来自 Firebase 数据库位置的数据。任何 当您从 Firebase 数据库读取数据时,您收到的数据是 数据快照。

DataSnapshot 被传递给您使用 on() 附加的事件回调 或once()。您可以将快照的内容提取为 JavaScript 对象通过调用其val() 方法。或者,您可以 通过调用child() 遍历快照返回子 快照(然后您可以调用 val() on)。

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)
}); 

另外请参考page(我的评论中已经提到)

这里有一个使用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) {
    }
});

我希望你现在有一个想法。

【讨论】:

  • 我明白你在说什么,但我正在寻找 Firebase 3。我应该指定的。感谢您的回答。
【解决方案4】:

您可以检查 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);
}];

【讨论】:

    【解决方案5】:

    使用它们中的任何一个如此简单易行... 你喜欢哪种方式

    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) {
        }
    });
    

    【讨论】:

      【解决方案6】:
      users = new HashMap<>();
                      users.put("UserID", milisec);
                      users.put("UserName", username);
                      users.put("UserEmailID", email);
                      users.put("UserPhoneNumber", phoneno);
                      users.put("UserPassword", hiddenEditPassword);
                      users.put("UserDateTime", new Timestamp(new Date()));
                      users.put("UserProfileImage", " ");
      
                      FirebaseFirestore.getInstance().collection("Users").document(phoneno).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                          @Override
                          public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                              if (task.getResult().exists()) {
                                  Toast.makeText(SignupActivity.this, "Already User", Toast.LENGTH_SHORT).show();
      
                              } else {
                                  FirebaseFirestore.getInstance().collection("Users")
                                          .document(phoneno).set(users).addOnCompleteListener(new OnCompleteListener<Void>() {
                                      @Override
                                      public void onComplete(@NonNull Task<Void> task) {
                                          Toast.makeText(SignupActivity.this, "Registers", Toast.LENGTH_SHORT).show();
      
                                      }
                                  });
                              }
                              hideProgressDialog();
                          }
                      });`
      enter code here
      

      【讨论】:

      • 超级解决方案用户登录
      猜你喜欢
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多