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

问题描述 投票:2回答:2

我有数据,结构如下:

enter image description here

我想从用户加载数据作为无限滚动。所以我执行一个查询:

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

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

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

这不加载任何东西,似乎startAt方法只有在数字或字符串以给定的字符串或数字开头而不是从子节点或节点5开始到子节点10时才有效。

// EDITED

我使用这种方法并且应该至少加载下两个项目,或者我错了?

  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

java android firebase firebase-realtime-database infinite-scroll
2个回答
4
投票

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

  • 上一页上最​​后一项的gamelvl的值。
  • 如果有多个子节点具有gamelvl的相同值,则是上一页上最​​后一项的键。

因此,如果屏幕截图中的最后一项是页面的最后一项,那么您将获得下一页:

mGamersDatabaseReference
  .child(gameId)
  .orderByChild("gamelvl")
  .startAt(0, "-L21rzBM...") // use the entire key
  .limitToFirst(10)

0
投票

编辑:虽然我的答案对Swift或NodeJS的用户可能有用,但我没有意识到实时数据库和Firestore的查询API在各个平台上没有很好地统一。特别是,您可以在NodeJS中使用Swift中无法执行的查询,反之亦然。我认为Frank van Puffelen上面的答案适用于Android,我的解决方案......谁知道?

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

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

  1. 添加一个以某种方式结合gameLvl和用户ID的字段。例如,它可以是包含gameLvl的字符串(具有固定的位数,因此42可以是00042),后跟连字符,后跟userId。另一个例子:它可以是一个等于gameLvl乘以十亿的整数,再加上userId模数十亿的散列。然后按该字段排序,查询从您检索的最后一个值开始。
  2. 切换到Firestore,这就像实时数据库,但大多数更好。在您的查询中使用offset
  3. 切换到Firestore。如果在列表中使用可能在第一个和第二个查询之间发生变化的偏移的想法让您感到娇气,请在游戏级别和userId上定义索引。将您的查询设置为由gameLvl和userId排序。查询gameLvl == lastGameLvluserId > lastUserId,如果没有得到足够的结果,请查询gameLvl > lastGameLvl的下一个查询。
© www.soinside.com 2019 - 2024. All rights reserved.