iOS Firebase 按日期分页
iOS Firebase Paginate by Date
我有一个笔记应用程序。我通常按 childByAutoId
对下面的 posts-userIds 节点进行分页,效果很好。我允许用户进行编辑,此时我只更新所有内容并将 editDate 添加到 post 本身。但是 editDate 位于 posts ref,而不是 posts-usersIds ref.
如何按 editDate 对 posts-usersIds ref 进行分页?问题是 editDates 是可选的,这意味着它们可能会进行 200 posts,但只有 2 次编辑甚至 none。无论哪种方式,如果用户想先看到 editDates,他们仍然需要看到 postDates 以及它们
订单将首先是 editDates,然后是 postDates,或者如果没有任何 editDates,则只显示所有 postDates
我在想,而不是使用 1 作为值,也许我应该把 postDate 或 editDate(如果他们做了一个)作为 posts-userIds
ref 的值,如
-postId-123: 1 // this what I normally use, it has no meaning, just a 1 so that it has a value
-postId-123: replace the 1 with the postDate and change this to editDate when they make an edit
也许我可以使用 ref.queryOrderedByValue()
但我不确定。
我的结构如下:
@posts
@postId-123 // childByAutoId
-uid: "userId-ABC"
-postDate: 1640898417.456389
-editDate: 1640814049.713224 // edit date is only there if the user made an edit
@posts-userIds
@userId-ABC
-postId-123: 1
我分页
let ref = Database.database().reference().child("posts-userIds").child(Auth.auth().currentUser!.uid)
if startKey == nil {
ref.queryOrderedByKey()
.queryLimited(toLast: 20)
.observeSingleEvent(of: .value, with: { (snapshot) in
// get posts and set startKey
})
} else {
ref.queryOrderedByKey()
.queryEnding(atValue: startKey!)
.queryLimited(toLast: 21)
.observeSingleEvent(of: .value, with: { (snapshot) in
})
}
Firebase 查询只能 order/filter 在其正在考虑 return 的节点下(在固定路径中)的值。因此,您不能对 posts
.
下的值进行 posts-userIds
解决方案是在 posts-userIds
下复制您想要 order/filter 的值,或者直接作为值(在这种情况下,您将使用 queryOrderedByValue
作为订单),或者在 child 属性 中(在这种情况下,您将使用 queryOrdered(byChild:)
作为订单。我倾向于使用后者,因为一旦有一个值,您想要 order/filter 上,通常会有更多的人下线。
这种数据复制在 NoSQL 数据库中很常见,所以如果您还不习惯,我建议您阅读 NoSQL data modeling, and watching Firebase for SQL developers。
我有一个笔记应用程序。我通常按 childByAutoId
对下面的 posts-userIds 节点进行分页,效果很好。我允许用户进行编辑,此时我只更新所有内容并将 editDate 添加到 post 本身。但是 editDate 位于 posts ref,而不是 posts-usersIds ref.
如何按 editDate 对 posts-usersIds ref 进行分页?问题是 editDates 是可选的,这意味着它们可能会进行 200 posts,但只有 2 次编辑甚至 none。无论哪种方式,如果用户想先看到 editDates,他们仍然需要看到 postDates 以及它们
订单将首先是 editDates,然后是 postDates,或者如果没有任何 editDates,则只显示所有 postDates
我在想,而不是使用 1 作为值,也许我应该把 postDate 或 editDate(如果他们做了一个)作为 posts-userIds
ref 的值,如
-postId-123: 1 // this what I normally use, it has no meaning, just a 1 so that it has a value
-postId-123: replace the 1 with the postDate and change this to editDate when they make an edit
也许我可以使用 ref.queryOrderedByValue()
但我不确定。
我的结构如下:
@posts
@postId-123 // childByAutoId
-uid: "userId-ABC"
-postDate: 1640898417.456389
-editDate: 1640814049.713224 // edit date is only there if the user made an edit
@posts-userIds
@userId-ABC
-postId-123: 1
我分页
let ref = Database.database().reference().child("posts-userIds").child(Auth.auth().currentUser!.uid)
if startKey == nil {
ref.queryOrderedByKey()
.queryLimited(toLast: 20)
.observeSingleEvent(of: .value, with: { (snapshot) in
// get posts and set startKey
})
} else {
ref.queryOrderedByKey()
.queryEnding(atValue: startKey!)
.queryLimited(toLast: 21)
.observeSingleEvent(of: .value, with: { (snapshot) in
})
}
Firebase 查询只能 order/filter 在其正在考虑 return 的节点下(在固定路径中)的值。因此,您不能对 posts
.
posts-userIds
解决方案是在 posts-userIds
下复制您想要 order/filter 的值,或者直接作为值(在这种情况下,您将使用 queryOrderedByValue
作为订单),或者在 child 属性 中(在这种情况下,您将使用 queryOrdered(byChild:)
作为订单。我倾向于使用后者,因为一旦有一个值,您想要 order/filter 上,通常会有更多的人下线。
这种数据复制在 NoSQL 数据库中很常见,所以如果您还不习惯,我建议您阅读 NoSQL data modeling, and watching Firebase for SQL developers。