【问题标题】:Firebase Unique ValueFirebase 独特价值
【发布时间】:2016-12-24 23:32:56
【问题描述】:

在 Firebase 中具有以下结构:

-events
     -Firebase Push ID for Event 1
         **-key: "DF2342"**
         -name: "Event 1"
         -createdOn : 12/12/12
     -Firebase Push ID for Event 2
         **-key: "AB1232"**
         -name: "Event 1"
         -createdOn : 12/12/12

每个密钥都是由运行应用程序的设备在本地(DF2342 和 AB1232)自动生成的,但我想先在设备上生成密钥,然后检查密钥是否已存在于 firebase 数据库中。如果确实存在,请重新生成密钥并重试。这是我使用的代码:

 let boardKey = self.keyGenHelper.generateUniqueKey()
        var validData = false
        while(!validData){
        databaseRef?.child("events").queryOrdered(byChild: "key").queryEqual(toValue: boardKey).observeSingleEvent(of: .childAdded, with: { (snapshot) in
            if !snapshot.exists() {
                let boardIdRef = self.databaseRef!.child("events").childByAutoId()
                boardIdRef.setValue(board.generateDictionary(key: boardKey))
                completion(boardKey, boardIdRef.key)
                validData = true
            }
        }, withCancel: {(error) in
            print(error)
        })
        }

这里的问题是 while 循环一直在进行,并且从未得到 firebase 的响应。对我来说完成这项任务的最佳方法是什么?

【问题讨论】:

  • 困难,你的意思是它们是“与人类共享的钥匙”?? (有点像“访问代码”?)
  • 没有简单的方法来确保跨多个子节点的特定属性的唯一值。解决方案是将值作为键存储在二级索引中(实际上只是一个查找列表)。请参阅此答案以获得很好的解释:stackoverflow.com/questions/35243492/…

标签: swift firebase firebase-realtime-database


【解决方案1】:

由于您的应用程序要求您不能使用childByAutoId,因此确保生成唯一 ID 的一种方法是在 Firebase 中存储一个仅包含您生成的 ID 的附加表。例如:

"keys": {
  "DF2342": true,
  "AB1232": true,
  ...
}

然后,当您生成密钥时,您可以执行以下操作:

let boardKey = self.keyGenHelper.generateUniqueKey()
var validData = false
while(!validData){
// check /keys in the database to see if we've already generated a key of this value
databaseRef?.child("keys").queryEqual(toValue: boardKey).observeSingleEvent(of: .childAdded, with: { (snapshot) in
    if !snapshot.exists() {
        let boardIdRef = self.databaseRef!.child("events").childByAutoId()
        boardIdRef.setValue(board.generateDictionary(key: boardKey))
        completion(boardKey, boardIdRef.key)
        validData = true
    }
}, withCancel: {(error) in
    print(error)
})

您还需要确保将新生成的密钥写入/keys。

【讨论】:

  • 首先,感谢您的回答,尽管这不是我想要的。我已经在使用它来识别每个事件。这些新密钥是易于共享的密钥(例如 DF2342 和 AB1232),我需要确保没有使用此值创建的另一个事件。
猜你喜欢
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2011-03-26
  • 1970-01-01
相关资源
最近更新 更多