从firebase数据库获取数据时如何解决数据覆盖问题

时间:2017-11-06 11:49:07

标签: java android firebase firebase-realtime-database

我有这个数据库:

enter image description here

在活动A中,我点击了一个类(listitem),然后将该类的ID传递给此活动,如下所示: -

so = getIntent().getStringExtra("send_id");

现在我在so内的此活动中有ClassId。然后我运行这个查询:

myref= FirebaseDatabase.getInstance().getReference().child("ClassStudent");
Query fk=myref.orderByChild("ClassId").equalTo(so);
fk.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        student=dataSnapshot.child("Studentid").getValue().toString();
        //a breakpoint here gives student=oyvEbB0128Y90ADzXnL0UwCUy0Z2                                
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
}

因此,在查询中,我希望所有具有该classid orderByChild("ClassId").equalTo(so)

的学生ID

然后我创建了 FirebaseRecycleradapter

FirebaseRecyclerAdapter<Info,ViewHolder> recyclerAdapter=new FirebaseRecyclerAdapter<Info,ViewHolder>(Info.class, R.layout.row, ViewHolder.class, fk) {

    @Override
    protected void populateViewHolder(final ViewHolder holder, Info model, int position) {
        holder.title.setText(student); //a breakpoint here gives student = 7AnhQ7pRwhXDRqytjSUkoJrOB253
    }
}

现在数据出现(在电话屏幕上),如下所示:

结果

7AnhQ7pRwhXDRqytjSUkoJrOB253
7AnhQ7pRwhXDRqytjSUkoJrOB253

上述学生ID出现两次,而应该是:

应该是

 7AnhQ7pRwhXDRqytjSUkoJrOB253
 oyvEbB0128Y90ADzXnL0UwCUy0Z2

因为这两个学生都在那个班级。

我也覆盖了getItemIdgetItemViewType

1 个答案:

答案 0 :(得分:1)

要解决此问题,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference classStudentRef = rootRef.child("ClassStudent");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String Studentid = ds.child("Studentid").getValue(String.class);
            Log.d("TAG", Studentid);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
classStudentRef.addListenerForSingleValueEvent(eventListener);

输出将是:

7AnhQ7pRwhXDRqytjSUkoJrOB253
oyvEbB0128Y90ADzXnL0UwCUy0Z2

编辑:如果您需要两次查询数据库,请获取coreponding stundet的学生姓名。因此,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference classStudentRef = rootRef.child("ClassStudent");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String Studentid = ds.child("Studentid").getValue(String.class);
            Log.d("TAG", Studentid);

            DatabaseReference studentIdRef = rootRef.child("Student").child(Studentid);
            ValueEventListener valueEventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String name = ds.child("name").getValue(String.class);
                    Log.d("TAG", name);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            studentIdRef.addListenerForSingleValueEvent(valueEventListener);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
classStudentRef.addListenerForSingleValueEvent(eventListener);