Firebase查询和数据库结构

时间:2017-02-05 09:08:47

标签: android firebase firebase-realtime-database

我是Firebase的初学者。要在我的Android应用程序中创建类似排行榜的列表,我在firebase上设置了一个数据库,如下所示:enter image description here

其中所有userUID都位于“users”节点下,并且每个userUID节点下都是用户的数据。我试图使用Query类方法访问具有前3个最高“totalIMPs”值的3个用户,并在Listview(list_TotalIMPs)上显示他们的“名称”。为此,我尝试了以下代码:

final ArrayAdapter<String> adapter_totalIMPs=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1);
list_TotalIMPs=(ListView)findViewById(R.id.listView_TotalIMPs);
list_TotalIMPs.setAdapter(adapter_totalIMPs);
Query query1=databaseReference.child("users").orderByChild("totalIMPs").limitToLast(3);
query1.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            adapter_totalIMPs.clear();
            adapter_totalIMPs.add("1");//for testing
            adapter_totalIMPs.add("2");//for testing
            adapter_totalIMPs.add("3");//for testing
            for(DataSnapshot postsnapshot:dataSnapshot.getChildren())
            {
                adapter_totalIMPs.add((String)postsnapshot.child("name").getValue());
                Toast.makeText(MainActivity.this,"Add in list: "+(String)postsnapshot.child("name").getValue(),Toast.LENGTH_LONG).show();
            }
        }
        @Override public void onCancelled(DatabaseError databaseError){Toast.makeText(MainActivity.this,"Add in list: CANCELLED",Toast.LENGTH_LONG).show();}
    });

但是,只有测试字符串“1”,“2”和“3”出现在我的列表中,而且,没有Toast显示。这意味着在“for”循环中出现问题,我想这与数据库结构有关。但是我在解决这个问题时遇到了问题。有人可以帮忙吗?非常感谢你。

(我想知道数据快照是否为空,以至于从未输入“for”循环?)

1 个答案:

答案 0 :(得分:1)

您正在设置适配器正在读取数据。尝试在onChange方法中设置适配器:

Query query1=databaseReference.child("users").orderByChild("totalIMPs").limitToLast(3);
query1.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            adapter_totalIMPs.clear();
            adapter_totalIMPs.add("1");//for testing
            adapter_totalIMPs.add("2");//for testing
            adapter_totalIMPs.add("3");//for testing
            for(DataSnapshot postsnapshot:dataSnapshot.getChildren())
            {
                adapter_totalIMPs.add((String)postsnapshot.child("name").getValue());
                Toast.makeText(MainActivity.this,"Add in list: "+(String)postsnapshot.child("name").getValue(),Toast.LENGTH_LONG).show();
            }
            list_TotalIMPs.setAdapter(adapter_totalIMPs);
        }
        @Override public void onCancelled(DatabaseError databaseError){Toast.makeText(MainActivity.this,"Add in list: CANCELLED",Toast.LENGTH_LONG).show();}
    });