【问题标题】:Check if an object with a certain query exists in Firebase检查 Firebase 中是否存在具有特定查询的对象
【发布时间】:2016-06-07 22:55:06
【问题描述】:

我想检查某个属性设置为某个值的对象是否存在。

以下是我在 Firebase 上的数据的示例:

object: {
  object-one: {
    id: "something"
  }
}

现在我想获取一个 id 不存在的对象:

let objectsRef = FIRDatabase.database().reference().child("object")
let query = objectsRef.queryOrderedByChild("id").queryEqualToValue("something else")

query.observeSingleEventOfType(.Value, withBlock: { (snapshot) in
  // Never get's called
})

由于没有带有id = "something else" 的条目,因此永远不会调用完成。但是我怎么知道它是不是因为互联网问题或仅仅因为该对象真的不存在而被调用?!?

【问题讨论】:

  • 你总是知道对象一键吗?正在尝试获取与该值匹配的多个项目?还是只有一个?
  • 基本上我想知道天气至少有一个具有特定 ID 的项目。 ID 将是登录用户的 UID
  • 我刚刚做了 q 快速测试,.Value 事件在一个不存在的节点上为我触发。在那种情况下,snapshot.exists() 是错误的。你确定你有阅读权限吗?见stackoverflow.com/questions/37403954/…
  • 对我来说,该事件也会在具有您正在使用的相同查询的不存在节点上触发。您可以使用带有“withCancelBlock”的 observeSingleEventOfType 版本来确定您是否有权限问题 ..reference here firebase.google.com/docs/reference/ios/firebasedatabase/…

标签: ios firebase firebase-realtime-database


【解决方案1】:

您可以使用 valueEventListner。它获取当前数据并监听任何进一步的更新。如果数据不存在,dataSnapshot.exists() 将返回 false。

例如 我的数据库包含用户对象列表,其中 emailId 是每个用户对象中的字段之一。

[
    user1: {emailId: abc@xyz.com},
    user2: {emailId: abc1@xyz1.com}
]

我可以通过 emailId 字段搜索并检查该用户是否存在。

ref.orderByChild("emailId").equalTo("unavailable@xyz.com").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                System.out.println(dataSnapshot.exists());//false, if values is not present
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

【讨论】:

    【解决方案2】:

    【讨论】:

    • OP 询问的是为什么事件根本没有被调用,而不是当它被调用时返回的内容。
    猜你喜欢
    • 2019-03-31
    • 2017-06-23
    • 2012-11-12
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多