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 登录

如何从 Firebase 函数调用第三方 Rest API 以用于 Google 上的操作