Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firebase UI:从一个子节点接收所有密钥并使用它从另一个节点接收信息并将其填入Recyclerview的解决方案?_Java_Android_Firebase_Firebase Realtime Database_Firebaseui - Fatal编程技术网

Java Firebase UI:从一个子节点接收所有密钥并使用它从另一个节点接收信息并将其填入Recyclerview的解决方案?

Java Firebase UI:从一个子节点接收所有密钥并使用它从另一个节点接收信息并将其填入Recyclerview的解决方案?,java,android,firebase,firebase-realtime-database,firebaseui,Java,Android,Firebase,Firebase Realtime Database,Firebaseui,我正在搜索一个解决方案,以从我的孩子“药物治疗”获取数据,并使用ID从“药物治疗计划”节点接收特定数据,并将其显示在Recyclerview中 数据库结构: 目前,我正在使用Firebase UI填充我的Recyclerview private DatabaseReference mRef; private RecyclerView mRecyclerView; private RecyclerView.LayoutManager mLayoutManager; private Fireba

我正在搜索一个解决方案,以从我的孩子“药物治疗”获取数据,并使用ID从“药物治疗计划”节点接收特定数据,并将其显示在Recyclerview中

数据库结构:

目前,我正在使用Firebase UI填充我的Recyclerview

private DatabaseReference mRef;

private RecyclerView mRecyclerView;
private RecyclerView.LayoutManager mLayoutManager;
private FirebaseRecyclerAdapter<Medication,MedicationViewHolder> mAdapter;

List<User> items = new ArrayList<>();

User user = new User();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRecyclerView = findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);

    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    setData();
}

private void setData() {
    Query query = FirebaseDatabase.getInstance().getReference().child("Medication_plan");
    FirebaseRecyclerOptions<Medication> options = new FirebaseRecyclerOptions.Builder<Medication>()
            .setQuery(query,Medication.class)
            .build();

    mAdapter = new FirebaseRecyclerAdapter<Medication, MedicationViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull MedicationViewHolder holder, int position, @NonNull Medication model) {
            final Medication tempmed = new Medication(model.getDr()
                    ,model.getMedicine()
                    ,model.getDate()
                    ,model.getComment());

            holder.mDoctor.setText(model.getDr());
            holder.mMedicine.setText(model.getMedicine());
            holder.mDate.setText(model.getDate());
        }

        @NonNull
        @Override
        public MedicationViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.my_text_view,viewGroup,false);
            MedicationViewHolder vh = new MedicationViewHolder(v);
            return vh;
        }
    };

    mRecyclerView.setAdapter(mAdapter);
}

@Override
protected void onStart() {
    mAdapter.startListening();
    super.onStart();
}

@Override
protected void onStop() {
    mAdapter.stopListening();
    super.onStop();
}
私有数据库参考mRef;
私人回收视图mRecyclerView;
private RecyclerView.LayoutManager MLLayoutManager;
私人FirebaseRecyclerAdapter mAdapter;
列表项=新建ArrayList();
用户=新用户();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView=findviewbyd(R.id.my\u recycler\u视图);
mRecyclerView.setHasFixedSize(true);
mLayoutManager=新的LinearLayoutManager(此);
mRecyclerView.setLayoutManager(mllayoutmanager);
setData();
}
私有void setData(){
Query Query=FirebaseDatabase.getInstance().getReference().child(“用药计划”);
FirebaseRecyclerOptions选项=新建FirebaseRecyclerOptions.Builder()
.setQuery(查询,medicing.class)
.build();
mAdapter=新FirebaseRecyclerAdapter(选项){
@凌驾
受保护的无效onBindViewHolder(@NonNull MedicinationViewHolder holder,int位置,@NonNull Medicing model){
最终药物tempmed=新药物(model.getDr()
,model.getMedicine()
,model.getDate()
,model.getComment());
holder.mDoctor.setText(model.getDr());
holder.mMedicine.setText(model.getMedicine());
holder.mDate.setText(model.getDate());
}
@非空
@凌驾
公共药物ViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
View v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.my_text_视图,viewGroup,false);
MedicinationViewHolder vh=新MedicinationViewHolder(v);
返回vh;
}
};
mRecyclerView.setAdapter(mAdapter);
}
@凌驾
受保护的void onStart(){
mAdapter.startListening();
super.onStart();
}
@凌驾
受保护的void onStop(){
mAdapter.stopListening();
super.onStop();
}

当我使用此代码时,我会获取每个药物计划,但我只希望用户提供具体的计划。

添加此功能以获取您的数据:

ArrayList<String> list = new ArrayList<String>();
DatabaseReference ref= FirebaseDatabase.getInstance().getReference("User").child("R3").child("medication");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snap: dataSnapshot.getChildren()) {
            list.add(snap.child("id").getValue(String.class));
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});
ArrayList list=new ArrayList();
DatabaseReference ref=FirebaseDatabase.getInstance().getReference(“用户”).child(“R3”).child(“药物”);
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot快照:DataSnapshot.getChildren()){
添加(snap.child(“id”).getValue(String.class));
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
w(标记“onCancelled”,databaseError.toException());
}
});
之后,添加此代码以获取第二个数据信息:

ArrayList<String> listOfSomething = new ArrayList<String>();
DatabaseReference ref=  FirebaseDatabase.getInstance().getReference("Medication_plan");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (String s: list) {
            listOfSomething.add(dataSnapshot.child("s").child("comment").getValue(String.class));
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});
ArrayList listOfSomething=new ArrayList();
DatabaseReference ref=FirebaseDatabase.getInstance().getReference(“药物治疗计划”);
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
用于(字符串s:列表){
添加(dataSnapshot.child(“s”).child(“comment”).getValue(String.class));
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
w(标记“onCancelled”,databaseError.toException());
}
});

在我的示例中,我检索注释。您可以在任何您想要检索的地方更改它。

要仅获取与特定用户对应的药物,您需要查询数据库两次。一次获取药品ID,第二次获取药品的详细信息,如以下代码行所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference medicationRef = rootRef.child("User").child("r3").child("medication");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String medicationKey = ds.getKey();

            DatabaseReference medicationKeyRef = rootRef.child("Medication_plan").child(medicationKey);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot ds : dataSnapshot.getChildren()) {
                        Medication medication = ds.getValue(Medication.class);
                        Log.d(TAG, medication.getMedicine());
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
                }
            };
            medicationKeyRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
medicationRef.addListenerForSingleValueEvent(valueEventListener);
logcat中的输出将为:

Aspirin
Paracetamol
除此之外,还应简化
User
节点,如以下模式所示:

Firebase-root
   |
   --- User
        |
        --- R3
            |
            --- lastname: "Hirsch"
            |
            --- medication
            |      |
            |      --- 1234: true
            |      |
            |      --- assf12: true
            |
            --- name: "Rob"

上述代码也适用于此结构。

能否显示您已经尝试过的内容?看,我已经用代码更新了我的帖子,但我不知道它背后的逻辑。现在我看到了……在第一个id中,你有一个数字,在第二个id中,你有一个字符串。把第一个id改成“1234”哦,是的,我明白我的错误了,谢谢。我再次尝试了你的代码,它工作得很好,但我仍然卡住了。现在我有了用户的ID,但我需要在Idsi的帮助下获取药物计划中的特定信息。我为您的第二个问题添加了一个编辑:如果我帮你重击一下,勾号按钮也会帮我。你要什么就问我吧!对不起,我忘了!我最近试过了,但对我不起作用。@HoaBinh你为什么说它不起作用?您是否有错误或行为是什么?