我正在尝试使用firebase实时数据库对数据进行排序和过滤。在一种情况下,我想使用OrderByKey(因为我首先需要新问题,而密钥是使用推送功能生成的)来对数据进行排序,在另一种情况下我使用的是OrderByChild(因为我想使用时间戳进行排序,在这种情况下我不会&# 39;使用push但我使用用户的uid作为密钥。)
在这两种情况下,我首先想要最新的东西/人(问题/用户),所以我想按降序排序(在客户端我甚至反过来)。所以这是我在第一次查询后查询的方式。第一个查询在下面显示的查询中没有endAt(endAtKey)
部分。
对于OrderByKey:
ref.child("questions").orderByKey().endAt(endAtKey).limitToLast(10);
//data at questions node looks like this
{
"-L1CbnCkXJiRT9MKpoP1" : {
"mCorrectAnswer" : 1,
"mOptionA" : "ueud",
"mOptionB" : "h",
"mOptionC" : "h",
"mOptionD" : "h",
"mProblem" : "4shsudududududududurududu"
},
"-L1Dd9x6ws5di2rf8yay" : {
"mCorrectAnswer" : 1,
"mOptionA" : "sh",
"mOptionB" : "shsh",
"mOptionC" : "hehs",
"mOptionD" : "hssh",
"mProblem" : "12ffsnsjsjdbxbddhdbdbddjebddb"
}
对于OrderByChild:
mDatabaseReference.child("user_list").orderByChild("mTimeStamp")
.endAt(endAtKey).limitToLast(10);
//data at user_list reference looks like this
{
"VH78axip1bXN9dktsF4Az0oBche2":
"mTimeStamp": "1508782492973",
"mUserName": "Satyam Kumar"
},
"2MedW9KSYTcB8I1qp0xcoNuwPEf1":
"mTimeStamp": "1508823085614",
"mUserName": "Thirunagari Yeshwanth"
}
我想用10个一组的数据填充RecyclerView,所以onDataChange
我保存了onDataChange
方法中收到的第一个孩子的密钥。
if (countCopy == 1) { // while iterating through children this variable tells
//the index of the loop.
endAtKey = currentKey;
Log.e("endKey", endAtKey);
}
现在我面临的问题是使用上面的查询后续提取数据我收到了endAtKey
罚款(收到的数据也是预期的)OrderByKey
查询但是{{1} } endAtKey
查询始终相同,并且接收的数据始终相同。
我该如何解决这个问题?
答案 0 :(得分:4)
您的OrderByChild
查询存在的问题是,您获得的endAtKey
是关键,而不是timestamp
。请记住,OrderByChild用于查询时间戳属性,因此您的endAtKey
必须是时间戳而不是密钥。