我有数据,结构如下:
我想从用户加载数据作为无限滚动。所以我执行一个查询:
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
要加载下一页的项目,您需要了解两件事:
gamelvl
的值。gamelvl
的相同值,则是上一页上最后一项的键。因此,如果屏幕截图中的最后一项是页面的最后一项,那么您将获得下一页:
mGamersDatabaseReference
.child(gameId)
.orderByChild("gamelvl")
.startAt(0, "-L21rzBM...") // use the entire key
.limitToFirst(10)
编辑:虽然我的答案对Swift或NodeJS的用户可能有用,但我没有意识到实时数据库和Firestore的查询API在各个平台上没有很好地统一。特别是,您可以在NodeJS中使用Swift中无法执行的查询,反之亦然。我认为Frank van Puffelen上面的答案适用于Android,我的解决方案......谁知道?
结束编辑。其余的留给子孙后代。
这很棘手,因为可能有很多人对gameLvl具有相同的价值。我建议使用以下解决方案之一:
offset
。gameLvl == lastGameLvl
和userId > lastUserId
,如果没有得到足够的结果,请查询gameLvl > lastGameLvl
的下一个查询。