代码之家  ›  专栏  ›  技术社区  ›  Pako Andrade Gonzalez

如何从firebase中加载的最后一个项目加载下一个“n”项目

  •  2
  • Pako Andrade Gonzalez  · 技术社区  · 8 年前

    我有如下结构的数据:

    enter image description here

    我想将来自用户的数据加载为一个infite滚动。因此,我执行一个查询:

    mGamersDatabaseReference.child(gameId).orderByChild("gamelvl").limitToFirst(10)
    

    在此之前,我想加载接下来的10个项目。我已经尝试使用 startAt 和user用户ID或用户名,但这不会加载更多项目。

     oldestPlayerGameLvl = myGames.getUserName();
    mGamersDatabaseReference.child(gameId).orderByChild("gamelvl").limitToFirst(10).startAt(oldestPlayerGameLvl)
    

    这不会加载任何内容 startAt公司 方法仅在数字或字符串以给定的字符串或数字开头时有效,而不像从子节点或节点5到子节点10开始。

    //已编辑

    我使用这个方法,应该至少加载下两个项目,否则我错了??

      mGamersDatabaseReference
      .child(gameId)
      .orderByChild("gamelvl")
      .startAt(0, "-L1Tg7NgZpT_7U4CiAs3") // i use this values
      .limitToFirst(10)
    

    下一步应该是这样的,

     mGamersDatabaseReference
          .child(gameId)
          .orderByChild("gamelvl")
          .startAt(oldestPlayerGameLvl, oldestPlayerKey) 
          .limitToFirst(10)
    

    其中oldesPlayerGameLvl等于最后一个节点中的“gamelvl”值,并且 oldestPlayerKey等于同一最后一个节点中的键的值。 但这两个方法都返回null。

    //更新 https://github.com/QaplaGaming/QaplaG/blob/master/qapla.java

    2 回复  |  直到 7 年前
        1
  •  4
  •   Frank van Puffelen    8 年前

    要加载下一页的项目,您需要知道两件事:

    • 的价值 gamelvl 上一页最后一项的。
    • 上一页上最后一项的键,如果有多个子节点具有相同的值 gamelvl公司 .

    因此,如果屏幕截图中的最后一个项目是页面的最后一个项目,则下一页将显示:

    mGamersDatabaseReference
      .child(gameId)
      .orderByChild("gamelvl")
      .startAt(0, "-L21rzBM...") // use the entire key
      .limitToFirst(10)
    
        2
  •  0
  •   Bartholomew Furrow    8 年前

    编辑: 虽然我的回答对Swift或NodeJS的用户可能有用,但我没有意识到实时数据库和Firestore的查询API在不同平台之间没有很好的统一。特别是,您可以在NodeJS中处理查询,而在Swift中则做不到,反之亦然。弗兰克·范·帕夫伦(FrankvanPuffelen)的上述答案,我想,适用于Android,我的解决方案。。。谁知道呢?

    结束编辑。其余的留给子孙后代。

    这很棘手,因为可能有许多人对gameLvl具有相同的价值。我建议以下解决方案之一:

    1. 添加一个以某种方式组合gameLvl和用户id的字段。例如,它可以是一个包含gameLvl的字符串(具有固定数字,因此42可以是00042),后跟连字符,后跟用户id。另一个例子:它可以是一个等于gameLvl乘以十亿的整数,再加上用户ID除以十亿的散列。然后按该字段排序,查询从检索到的最后一个值开始。

    2. 切换到Firestore,它类似于实时数据库,但大多更好。使用 offset 在您的查询中。

    3. 切换到Firestore。如果在第一次和第二次查询之间可能会发生变化的列表上使用偏移量的想法让您感到恶心,请在游戏级别和用户ID上定义一个索引。将您的查询设置为按gameLvl排序,然后按userId排序。在以下位置进行查询 gameLvl == lastGameLvl userId > lastUserId ,如果没有得到足够的结果,请进行下一次查询 gameLvl > lastGameLvl .