因此,我正在构建一个应用程序,在其中向Firebase数据库添加某些单词。当用户输入要添加的单词时,我要检查该单词是否已存在于数据库中。如果是这样,那么我将显示警报。如果没有,我将其添加到数据库中。我将如何使用Swift做到这一点?任何帮助,将不胜感激。谢谢!
这是数据库结构:
speaktext-6-----
wordList
-LWQObIw1PKWJ_B9jNfp
word: "Water"
wordType: "Noun"
答案 0 :(得分:2)
您需要考虑到可能存在大量单词,因此加载所有单词不仅会很慢,因为它们必须先加载然后反复遍历以查找您要查找的单词,但是可能也会淹没设备的内存。
一个简单的解决方案是Firebase查询-让Firebase完成繁重的工作,只返回您想要的节点。这样会快很多,并且不会使设备不知所措。
这是一个告诉您Firebase结构中是否存在单词的函数
func findWord(aWord: String) {
let ref = self.ref.child("wordList")
let query = ref.queryOrdered(byChild: "word").queryEqual(toValue: aWord)
query.observeSingleEvent(of: .value, with: { snapshot in
if snapshot.exists() {
print("found the word")
//you could expand on this to indicate it was a Noun etc
} else {
print("\(aWord) is not in the wordList")
}
})
}
还要查看Firebase Sorting and Filtering Data Guide
*这假定为一个结构
root
wordList
word_id_0 //created with .childByAutoId
word: "Water"
答案 1 :(得分:1)
您只需要对child一词提出单个事件请求,然后可以验证它是否为.exists()
,如果它在那里,它将返回。
let reference = Database.database().reference().child(<#child#>).child(<#Word#>)
reference.observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
// handle word existing in database, show alert.
} else {
// handle word not existing in database, make a request to set the word in database.
}
})
根据您的评论,您想遍历孩子的每个元素,可以这样做:
let reference = Database.database().reference().child("wordList")
reference.observeSingleEvent(of: .value, with: { (snapshot) in
if let words = snapshot.value as? [String : [String : Any]] {
for word in words {
if let currentWord = word.value["word"] as? String {
if currentWord == "YOUR WORD HERE" {
// handle word in database.
return
}
}
}
// handle word NOT in database.
} else {
// handle empty array.
}
})