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

时间:2018-01-09 02:30:46

标签: java android firebase firebase-realtime-database infinite-scroll

我有数据,结构如下:

enter image description here

我想将用户的数据作为infite滚动加载。所以我执行一个查询:

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。

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

2 个答案:

答案 0 :(得分:4)

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

  • 上一页上最​​后一项的gamelvl值。
  • 上一页上最​​后一项的键,以防有多个子节点具有gamelvl的相同值。

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

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

答案 1 :(得分:0)

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

结束编辑。其余的留给后人。

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

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

  2. 切换到Firestore,这就像实时数据库,但大多数情况下更好。在查询中使用$row[] = ($judul->jumlah_total != 0 ? "Total : " . anchor("buku/total/$judul->id_judul",$judul->jumlah_total) : $judul->jumlah_total) . "<br>" . ($judul->jumlah_ada != 0 ? "Ada : " . anchor("buku/ada/$judul->id_judul",$judul->jumlah_ada) : $judul->jumlah_ada) . "<br>" . ($judul->jumlah_dipinjam != 0 ? "Dipinjam : " . anchor("buku/dipinjam/$judul->id_judul",$judul->jumlah_dipinjam) : $judul->jumlah_dipinjam) ;

  3. 切换到Firestore。如果在列表中使用可能在第一个和第二个查询之间发生变化的偏移的想法让您感到娇气,请在游戏级别和userId上定义索引。将您的查询设置为由gameLvl和userId排序。在offsetgameLvl == lastGameLvl之间进行查询,如果没有获得足够的结果,请查看userId > lastUserId的下一个查询。