iOS Firebase 按日期分页

Posted

技术标签:

【中文标题】iOS Firebase 按日期分页【英文标题】:iOS Firebase Paginate by Date 【发布时间】:2021-12-31 18:31:55 【问题描述】:

我有一个笔记应用程序。我通常通过childByAutoId 对下面的 posts-userIds 节点进行分页,这工作正常。我允许用户进行编辑,此时我只需更新所有内容并将 editDate 添加到帖子本身。但是那个 editDate 在 posts 参考,而不是 posts-usersIds 参考。

如何通过editDate 对posts-usersIds ref 进行分页?问题是 editDates 是可选的,这意味着他们可能会发布 200 个帖子,但只有 2 个编辑甚至根本没有编辑。无论哪种方式,如果用户想先看到 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
    )



                

【问题讨论】:

【参考方案1】:

Firebase 查询只能对它正在考虑返回的节点下(在固定路径中)的值进行排序/过滤。所以你不能 posts-userIds 使用来自 posts 下的值。

解决方案是在posts-userIds 下复制您想要订购/过滤的值,或者直接作为值(在这种情况下,您将使用queryOrderedByValue 进行订购),或者在子属性中(在这种情况下,您将使用queryOrdered(byChild:) 进行订单。我倾向于支持后者,因为一旦您想要订购/过滤一个值,通常会有更多的值。

这种数据复制在 NoSQL 数据库中很常见,所以如果您还不习惯,我建议您阅读NoSQL data modeling,并观看Firebase for SQL developers。

【讨论】:

queryOrdered(byChild:) 似乎是一个不错的选择,我以前从未使用过,谢谢!我可以在 5 分钟内接受你的回答

以上是关于iOS Firebase 按日期分页的主要内容,如果未能解决你的问题,请参考以下文章

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba

Stripe 和 Firebase:FirebaseError:collection() 的第一个参数应为 CollectionReference、DocumentReference 或 Fireba

无法在 iOS 中连接 firebase crashlytics

iOS 10 Firebase 通知未在后台显示

构建 Flutter iOS 应用程序时出错 - Firebase

iOS Firebase + Fabric Beta Crashylitics 未报告问题