2016-12-24 131 views
0

具有火力地堡的结构如下:火力地堡独特价值

-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循环一直走下去,并且从来没有从火力回应。对我来说完成这项任务最好的办法是什么?

+0

很难,你的意思是他们是“与人分享的钥匙”? (有点像“访问代码”?) – Fattie

+0

没有简单的方法来确保跨多个子节点的特定属性的唯一值。解决方案是将值作为键存储在二级索引中(实际上只是一个查找列表)。看到这个答案的一个很好的解释:http://stackoverflow.com/questions/35243492/firebase-android-make-username-unique –

回答

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

+0

首先,感谢您的答案,虽然这不是我想要的。我已经用它来识别每个事件。这些新密钥是一个易于共享的密钥(例如DF2342和AB1232),我需要确保没有使用此值创建另一个事件。 – REMP