【问题标题】:how to resolve data overriding when getting data from firebase database从firebase数据库获取数据时如何解决数据覆盖
【发布时间】:2017-11-06 11:49:07
【问题描述】:

我有这个数据库:

在活动 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

上面的学生证出现了两次,应该是:

应该是

 7AnhQ7pRwhXDRqytjSUkoJrOB253
 oyvEbB0128Y90ADzXnL0UwCUy0Z2

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

我也覆盖了getItemIdgetItemViewType

【问题讨论】:

  • 你试过没有“等于”的查询吗?
  • @TheDude 是的,我检索到了这个7AnhQ7pRwhXDRqytjSUkoJrOB253 2 次,它没有得到另一个嗯。问题出在 populateviewholder 和查询之间
  • 可能是您的“学生”变量覆盖现有数据。

标签: java android firebase firebase-realtime-database


【解决方案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

编辑:如果您需要查询数据库两次,则获取相应学生的姓名。所以,请使用以下代码:

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);

【讨论】:

  • 它不起作用,在日志中我得到了那个输出(我也在我的问题的代码中的日志中得到了那个输出)但是在屏幕上它只有这个7AnhQ7pRwhXDRqytjSUkoJrOB253 两次
  • 尝试在((TextView)holder.title.findViewById(android.R.id.textView)).setText(student); 内部使用此代码populateViewHolder 方法。现在可以用了吗?
  • 您是否有错误或再次打印相同的内容?
  • 不,我实际上得到了空点异常,现在我在 populateviewholder 中添加了侦听器,但即使在日志中获取另一个 id,它仍然打印相同的东西
  • 在这种情况下,我认为问题出在您的 .XML 文件中。一切都好吗?
猜你喜欢
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2019-01-17
  • 2019-07-10
相关资源
最近更新 更多