使用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"
}
}
}
答案 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)
})