在Firebase SWIFT中查询数组

时间:2016-05-13 15:14:54

标签: arrays swift firebase firebase-realtime-database

使用swift和firebase我有一个像这样的数据列表

{
"posts" : {
 "-KHbULJcKqt9bSpxNO9k" : {
  "author" : "Michele",
  "postText" : "tags as arrays?",
  "tag" : [ "HELLO", "WHAT'S UP?", "TEST" ]
}

还有更多帖子。我想按标签搜索,如果帖子包含搜索词作为标签,则返回整个帖子。我已经能够使用queryEqualToValue:使用字符串执行此操作,但无法为数组解决此问题。感谢你们,正确方向的任何一点都表示赞赏。

这就是我的保存功能

func createNewPost(post: Dictionary<String, AnyObject>, tags: [String]) {
    let firebaseNewPost = POST_REF.childByAutoId()
    let firebaseTag = Firebase(url: "\(POST_REF)/\(firebaseNewPost.key)/tag")

    print(firebaseTag)


    firebaseNewPost.setValue(post)

    for tag in tags {
        let tagID = firebaseTag.childByAutoId()

        tagID.setValue(tag)
    }
}

现在,我需要帮助搜索数据并根据用户搜索的内容检索某些帖子。这就是我只使用一个标签时所使用的,它只是一个字符串。

    func loadTaggedShit(searchTerm: String) {

    DataService.dataService.POST_REF.queryOrderedByChild("tag").queryEqualToValue(seachTerm).observeEventType(.ChildAdded, withBlock: { snapshot in
        self.posts = []

        if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] {
            for snap in snapshots {
                if let postDictionary = snap.value as? Dictionary<String, AnyObject> {
                    let key = snap.key
                    let post = Post(key: key, dictionary: postDictionary)

                    self.posts.insert(post, atIndex: 0)
                }
            }
        }

        self.tableView.reloadData()


    })

}

此外,数据现在看起来像这样

"posts":{
 "-KHj_bDJmZJut7knKoUX" : {
  "author" : "Michele",
  "postText" : "what's up",
  "tag" : {
    "-KHj_bDJmZJut7knKoUY" : "HEY"
   }
 }
}

1 个答案:

答案 0 :(得分:1)

Firebase阵列非常具有情境性,如果可能的话应该尽量避免使用。

代码中的数组是非常强大的数据结构,但它们在JSON结构中不能很好地工作。如果修改它们,比如删除节点,那么该索引也将被删除。这使得阵列有了“漏洞”。例如0,1,2,4,5,7等等。那么,在帖子节点中自己创建一个标签子节点,然后用childByAutoId创建密钥的子节点

"posts" : {
 "-KHbULJcKqt9bSpxNO9k" : {
    "author" : "Michele",
    "postText" : "tags as arrays?",
    "tags"
       tag_id_0
         tag_title: "HELLO"
       tag_id_1
         tag_title: "WHAT'S UP?"
       tag_id_2
         tag_title: "TEST"
}

您甚至可以考虑创建一个单独的标记节点并在posts节点中引用它 - 特别是如果它们可以重复使用。

编辑:

根据一些其他信息,将有一个不同的结构,因为OP需要查询包含特定标签的帖子,并且标签实际上是可重复使用的,而不是特定于帖子:

posts
  -KHbULJcKqt9bSpxNO9k
    author: "Michele"
    postText: "tags as arrays?"
    tags
      tag_id_1: true
      tag_id_2: true
  -JPHJSojo91920LLK0J
    author: "Larry"
    postText: "NO, don't use arrays"
    tags
     tag_id_2: true

tags
  tag_id_0
    tag_title: "HELLO"
  tag_id_1
    tag_title: "WHAT'S UP?"
  tag_id_2
    tag_title: "TEST"

然后接收所有使用TEST标记的帖子的代码,tag_id_2

这称为Firebase Deep Query

postsRef.queryOrderedByChild("tags/tag_id_2").queryEqualToValue(true)
        .observeSingleEventOfType(.Value, withBlock: { snapshot in
    print(snapshot)
})