如何从Firebase(java)检索最后一个子级?
我的问题是如何从“Ranklist”中检索最后一个孩子?我试图按值如何从Firebase(java)检索最后一个子级?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我的问题是如何从“Ranklist”中检索最后一个孩子?我试图按值orderByKeyByValue,但在我的情况下没有任何效果。我没有得到任何错误,我想我只是没有从这个查询中得到任何数据 编辑:这是我从data.getValue().toString->>{4=somekey4}中得到的,您的代码工作正常。我测试过了。您对数据库的查询返回父节点“Ranklist”的最后一个子节点。使您的数据库引用dbref成为全局成员 DatabaseReference lastRef = Firebase
orderByKey
ByValue,但在我的情况下没有任何效果。我没有得到任何错误,我想我只是没有从这个查询中得到任何数据
编辑:这是我从data.getValue().toString->>{4=somekey4}中得到的,您的代码工作正常。我测试过了。您对数据库的查询返回父节点“Ranklist”的最后一个子节点。使您的
数据库引用dbref
成为全局成员
DatabaseReference lastRef = FirebaseDatabase.getInstance().getReference().child("Ranklist");
Query lastQuery = lastRef.orderByKey().limitToLast(1);
lastQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot data) {
newUser.Rank=Long.parseLong(data.getKey().toString())+1;
OrderConsoleMessages();
texts[0].setText("Last Rank is: "+newUser.Rank+" | UID: " + data.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
OrderConsoleMessages();
texts[0].setText(databaseError.toString());
}
});
希望对你有帮助
快乐编码:-)在这种情况下不能使用查询。正如我在您的屏幕截图中所看到的,
Ranklist
节点是一个ArrayList
,要获取Ranklist
节点下最后一个孩子的值,即somekey4
,请使用以下代码行:
dbRef = FirebaseDatabase.getInstance().getReference().child("Ranklist");
Query lastQuery = dbRef.orderByKey().limitToLast(1);
lastQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot data : dataSnapshot.getChildren())
{
//if you call methods on dataSnapshot it gives you the required values
String s = data.getValue(); // then it has the value "somekey4"
String key = data.getKey(); // then it has the value "4:"
//as per your given snapshot of firebase database data
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}});
DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference();
DatabaseReference=rootRef.child(“Ranklist”);
ValueEventListener ValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
ArrayList ArrayList=(ArrayList)dataSnapshot.getValue();
字符串lastItem=arrayList.get(arrayList.size()-1);
Log.d(“标签”,最后一项);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
Log.d(标记,databaseError.getMessage());
}
};
参考AddListener for SingleValueEvent(valueEventListener);
日志猫中的输出将是:
somekey4
您的代码是正确的,但您只获得最后一个节点的密钥。因此,您需要使用以下方法进行更改:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child("Ranklist");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ArrayList<String> arrayList = (ArrayList<String>) dataSnapshot.getValue();
String lastItem = arrayList.get(arrayList.size() - 1);
Log.d("TAG", lastItem);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
ref.addListenerForSingleValueEvent(valueEventListener);
但是它是否只返回一次结果,或者侦听器继续工作直到我的程序停止?先生,我找不到包含常量的库。ARG_CONV_timestep。你能帮我吗?firebase core没有ARG_CONV_timestep,apache日志也没有。我在谷歌上找不到任何关于这方面的帮助。@A.Newbie Constants.ARG_CONV_timestep是一个你想根据它进行排序的ID。所以它可以是任何东西。每次当你的数据在firebase数据库中发生变化时,它都会调用。如果我的Ranklist包含一百万个条目呢?每次我想使用最后一个添加的子项时,我都能得到全部信息吗?这似乎不太有效。如果您的RekLIST包含1个MILIN条目,那么您应该考虑在“代码> RANKLISTAB/CODE >下面的每个属性改变一个对象和这样的查询:<代码>查询查询=dBrf.OrthByCube(“AdKEY”).LimiToLTAST(1);代码>但使用此数据库结构无法实现这一点。因此,不幸的是,faiizii awan的答案不会起作用,因为不能使用数据库结构使用这样的查询。因此,如果你认为我的答案/评论帮助了你,请考虑接受并投票表决。我会很感激的。谢谢你试过调试程序并检查过dataSnapshot中的内容吗?好的,这就是我从dataSnapshot中得到的,getValue().toString()->{4=somekey4}和getKey()函数中的内容?它返回Ranklistcheck答案我现在根据你的输出提交一些更改它将完美地返回你在getValue()中的值“somekey4”函数和getKey()函数中的“4”
dbRef.child("Ranklist")
.orderByChild(Constants.ARG_CONV_TIMESTEMP)
.limitToLast(1)
.addChildEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue();
String key = dataSnapshot.getKey();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}});