2016-12-24 100 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