【问题标题】:Firebase Rest Api:How To Use OrderBy() and StartAt() using The Last Key idFirebase Rest Api:如何使用 OrderBy() 和 StartAt() 使用 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,因为他帮了我很多忙 :)

【问题讨论】:

    标签: c# android firebase firebase-realtime-database


    【解决方案1】:

    正如我在 cmets 中关于您上一个问题所说:Firebase 实时数据库 REST API 将返回正确的过滤节点,但它们不会按任何定义的顺序 - 因为 JSON 对象中键的顺序是未定义的根据定义。你无法改变这一点。

    您需要对应用程序代码中的结果重新排序,然后确定第一个/最后一个。如果您对共享的 first/last of nodes 执行此操作,您将看到第一个节点具有 Views 33 和密钥 -Mn7-ZxkUPO01iddfh2tpEn

    要获取上一页,您可以使用:

    https://stackoverflow.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 - 看看您是否已经可以通过某种方式传递这两个值,或者您是否需要请求/更改库。
    • 确实如此,并且正如您发布的链接中所解释的那样,我在我使用的库中发布了一个新问题,或者我将手动发送请求,无论如何。你的回答很漂亮,对我帮助很大。祝你天天快乐,谢谢??
    猜你喜欢
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多