使用Java从Firebase数据库中获取数据

时间:2018-02-24 13:30:08

标签: java android firebase firebase-realtime-database

我一直在用一块墙撞击墙壁约8小时,现在我很绝望,所以我希望有人能够让这些东西运转起来。请让那里有人。

从表面上讲,问题很简单。我有一个firebase数据库,如下所示:

 AppName
   - Profiles
     - UID
       - Name

我想要做的就是从数据库中获取所有UID和Name值并将它们配对。我已经尝试了我可以在网上找到的所有东西,但这开始看起来不可能,我不明白为什么。这是问题所在:

任何将数据从数据库中提取出来的尝试都是同步的。所以我可以获得用户的UID,没问题,但是我无法看到Name值,因为要获取名称值我需要UID值,并且在我请求Name值时,UID是总是空的。

以下是我用来获取数据的代码:

OnCreate() {
   LoadContactKeys();
   LoadContactNames();
}


private void LoadContactKeys() {
    DatabaseReference contactsList = FirebaseDatabase.getInstance().getReference("Profiles").child(ping_userID).child("Contacts");
    contactsList.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                contactData[0][0] = String.valueOf(dsp.getKey());
                Toast.makeText(getBaseContext(), "contact: " + contactData[0][0], Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

private void LoadContactNames() {
    DatabaseReference contactsList = FirebaseDatabase.getInstance().getReference("Profiles").child(ping_userID).child("Contacts").child(contactData[0][0]).child("Name");
    contactsList.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                contactData[1][0] = String.valueOf(dsp.getKey());
                Toast.makeText(getBaseContext(), "contact: " + contactData[1][0], Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

我已经尝试了几种方法将它拆分,所以我可以首先填充UID,以便我可以实际使用它们来获取Names,但是我找不到任何可行的方法,所有内容总是同时被调用并且在名称调用时UID始终为空。

1 个答案:

答案 0 :(得分:1)

试试这个:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Profiles");
 ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot datas : dataSnapshot.getChildren()) {
            String key=datas.getKey();
            String name=datas.child("name").getValue().toString();
              }
        }
} 

数据快照为Profiles,然后使用for循环,它将在uid的直接子项内迭代,您将能够使用以下内容获取uid:String key=datas.getKey();名称使用String name=datas.child("name").getValue().toString();