Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Firebase(java)检索最后一个子级?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

如何从Firebase(java)检索最后一个子级?

如何从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

我的问题是如何从“Ranklist”中检索最后一个孩子?我试图按值
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) {

    }});