如何使用Swift和Firebase在数据库中搜索特定项目?

时间:2019-01-26 11:37:25

标签: ios swift database xcode firebase

因此,我正在构建一个应用程序,在其中向Firebase数据库添加某些单词。当用户输入要添加的单词时,我要检查该单词是否已存在于数据库中。如果是这样,那么我将显示警报。如果没有,我将其添加到数据库中。我将如何使用Swift做到这一点?任何帮助,将不胜感激。谢谢!

这是数据库结构:

speaktext-6-----
  wordList
    -LWQObIw1PKWJ_B9jNfp
       word: "Water"
       wordType: "Noun"

2 个答案:

答案 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.
    }
})