从Firebase实时获取表到回收站视图之间的数据

时间:2019-04-26 17:41:52

标签: android firebase firebase-realtime-database

我从Firebase读取数据时遇到问题。 但是,我只能获取单个数据,但是,我需要获取该数据的列表。 由于这是我使用Firebase的第一项工作。我过去只用过SQL。

这是我的Firebase结构。

"UserEO" : {
    "RZ5piQEWcoSonDYPu3NSKBrXTbW2" : {
      "-LdK1ZgjaKvXFjUeq-Yj" : {
        "keyUID" : "RZ5piQEWcoSonDYPu3NSKBrXTbW2"
      },
      "-LdK264lPX9eBBzYe0m4" : {
        "keyUID" : "RZ5piQEWcoSonDYPu3NSKBrXTbW2"
      }
    }   
},

"eventOrganizer" : {
    "-LdK1ZgjaKvXFjUeq-Yj" : {
      "deskripsi" : "USMA is .. ",
      "namaGrup" : "UKM USMA",
      "website" : "ukm.usma.blogspot.com"
    },
    "-LdK264lPX9eBBzYe0m4" : {
      "deskripsi" : "LPM KOMPEN is ..",
      "namaGrup" : "UKM LPM KOMPEN",
      "website" : ""
    }   },   

"users" : {
    "RZ5piQEWcoSonDYPu3NSKBrXTbW2" : {
      "email" : "kiranana@gmail.com",
      "nama" : "kirana"
    }   
}

这是我的代码, 我想选择该用户加入的组eventOrganizer。

    userId=auth.getCurrentUser().getUid();

    recyclerView = (RecyclerView) findViewById(R.id.rv_grupeo);
    layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(layoutManager);
    grupEOModelList = new ArrayList<>();
    adapter = new GrupEOAdapter(grupEOModelList,GrupEO.this);
    recyclerView.setAdapter(adapter);

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("UserEO").child(userId);
    databaseReference.addValueEventListener(valueEventListenerAdmin);
}

ValueEventListener valueEventListenerAdmin = new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String getKey = null;
        if (dataSnapshot.exists()){
            for (DataSnapshot snapshot : dataSnapshot.getChildren()){
                getKey = snapshot.getKey();
            }
            final DatabaseReference databaseReferenceEO = FirebaseDatabase.getInstance().getReference("eventOrganizer");
            databaseReferenceEO.orderByKey().equalTo(getKey).addValueEventListener(valueEventListener);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
};
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        grupEOModelList.clear();
        if (dataSnapshot.exists()){
            for (DataSnapshot snapshot : dataSnapshot.getChildren()){
                GrupEOModel grupEOModel = snapshot.getValue(GrupEOModel.class);
                grupEOModelList.add(grupEOModel);
            }
            adapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
};}

谢谢

2 个答案:

答案 0 :(得分:0)

我想问题出在这里

final DatabaseReference databaseReferenceEO = FirebaseDatabase.getInstance().getReference("eventOrganizer");
        databaseReferenceEO.orderByKey().equalTo(getKey).addValueEventListener(valueEventListener);

我不知道将valueListener嵌入OnDataChange内是一个好主意,我建议您删除它并使用回调。只需使用以下命令将UserEO转换为列表即可:

ArrayList<UserEO> td = (ArrayList<UserEO>) dataSnapshot.getValue();

通过回调将其返回,然后您可以使用valueEventListener为每个键调用一个方法。

我也想建议您简化一下。您可以在events: {"LdK1ZgjaKvXFjUeq", "-LdK264lPX9eBBzYe0m4"}之类的用户中添加另一个子级,这样每个用户都会有一个事件键列表,很简单。
充分利用NoSQL的关键是精心设计数据,针对查询进行优化,我可以看到您仍然像SQL表那样思考,但是没关系,因为您还在学习。

答案 1 :(得分:0)

您可以获得这样的数据列表:-

description