Firebase Rest Api:如何使用 OrderBy() 和 StartAt() 使用 Last Key id
Posted
技术标签:
【中文标题】Firebase Rest Api:如何使用 OrderBy() 和 StartAt() 使用 Last Key id【英文标题】:Firebase Rest Api:How To Use OrderBy() and StartAt() using The Last Key id 【发布时间】:2022-01-04 13:31:51 【问题描述】:我正在使用 c# 在我的 android 应用程序中使用 firebase 数据库 rest API 当页面打开时,我的应用程序从 firebase 数据库中获取 10 个数据,这些数据按(查看次数)排序.OrderBy("Views").LimitToLast(10)
到目前为止,我得到了正确的数据并且它工作正常,并且我将最后一个 id 存储在公共字符串中,因为当用户向下滚动列表视图时,我从 firebase 数据库中获得了另外 10 个元素,但是当我得到另一个10个数据并使用.StartAt(LastId).LimitToLast(10)
firebase将返回空(0)数据,因为当我使用.OrderBy("Views")
时返回的键没有正确排序所以我无法获得正确的最后一个ID获取从最后一个 id 开始的数据,我找到了一种使用 OrderByKey()
对键进行排序的方法,并获取正确的最后一个 id 并从最后一个 id 开始获取其他 10 个数据,**但我想获取按 (Views) 排序的数据) **,
总结:如何从按(“视图”)排序的 firebase 数据库中获取 10 个元素,同时我可以从前 10 个的最后一个 id 开始获取其他 10 个元素
我的 JSON 结构:
"Main" :
"News" :
"Categories" :
"Education" :
"-Mn7-ZxkUPO01ifhtpEn" :
"Text" : "some text",
"Title" : "some title",
"Views" : 5
,
"-Mn7-ZxkUPO01ifhtp11En" :
"Text" : "some text",
"Title" : "some title",
"Views" : 5
,
"-Mn7-ZxkUPO0112ifhtpEn" :
"Text" : "some text",
"Title" : "some title",
"Views" : 12
,
"-Mn7-ZxkUPO01dxifhtpEn" :
"Text" : "some text",
"Title" : "some title",
"Views" : 545
,
"-Mn7-ZxkUPO01sdifhtpEn" :
"Text" : "some text",
"Title" : "some title",
"Views" : 5
,
"-Mn7-ZxkUPO01ifddhtpEn" :
"Text" : "some text",
"Title" : "some title",
"Views" : 200
,
"-Mn7-ZxkUPO01ifdshtpEn" :
"Text" : "some text",
"Title" : "some title",
"Views" : 1
,
"-Mn7-ZxkUPO01ifhtdxpEn" :
"Text" : "some text",
"Title" : "some title",
"Views" : 223
提前致谢 我也感谢 Frank van Puffelen,因为他帮了我很多忙 :)
【问题讨论】:
【参考方案1】:正如我在 cmets 中关于您上一个问题所说:Firebase 实时数据库 REST API 将返回正确的过滤节点,但它们不会按任何定义的顺序 - 因为 JSON 对象中键的顺序是未定义的根据定义。你无法改变这一点。
您需要对应用程序代码中的结果重新排序,然后确定第一个/最后一个。如果您对共享的 first/last of nodes 执行此操作,您将看到第一个节点具有 Views
33
和密钥 -Mn7-ZxkUPO01iddfh2tpEn
。
要获取上一页,您可以使用:
https://***.firebaseio.com/70102492/Main/News/Categories/Education.json?print=pretty&orderBy=%22Views%22&limitToLast=10&endAt=33,%22-Mn7-ZxkUPO01iddfh2tpEn%22
所以:
我们endAt=33,"-Mn7-ZxkUPO01iddfh2tpEn"
,这意味着我们在下一页的第一项结束。我们在此参数中同时包含Views
的值和键,因为可能有多个节点的Views
等于33
,在这种情况下,数据库将使用键来选择正确的节点以结束。
您可能希望请求 11 个项目而不是 10 个,因为您已经显示了 -Mn7-ZxkUPO01iddfh2tpEn
。
【讨论】:
感谢您的澄清,我对键进行了排序并正确获取了最后一个 id-Mn7-ZxkUPO01iddfh2tpEn,但问题是EndAt
不支持 (LastValue) 的两个参数,LastId) 它只支持一个(字符串或双精度或长整数),我尝试将 LastValue(33)放在 .EndAt() 中并且它可以工作,但是正如你所说,如果有匹配相同值的元素(33 ),那么传递最后一个值和最后一个id的解决方案是什么
如我的回答所示:REST API 支持这两个值。您必须查看您使用的库,并查看它如何调用 REST API - 看看您是否已经可以通过某种方式传递这两个值,或者您是否需要请求/更改库。
确实如此,并且正如您发布的链接中所解释的那样,我在我使用的库中发布了一个新问题,或者我将手动发送请求,无论如何。你的回答很漂亮,对我帮助很大。祝你天天快乐,谢谢??以上是关于Firebase Rest Api:如何使用 OrderBy() 和 StartAt() 使用 Last Key id的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 REST API 读取 Firebase 有序数据?
Firebase Rest Api:如何使用 OrderBy() 和 StartAt() 使用 Last Key id
如何通过 HTTP REST API 访问我的 Firebase 数据库?
如何将firebase REST API响应转换为打字稿中的数组?
如何在 Flutter 中使用 rest api 不使用 firebase 以 google 或 facebook 登录