我正在寻找一种解决方案,从我的孩子“药物”中获取数据,并使用I从"medication_plan“节点接收特定数据,并将其显示在回收视图中。
DB-Structure:

目前,我正在使用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();
}当我使用这段代码时,我得到了每个用药计划,但我只想要用户的具体计划。
发布于 2019-01-12 05:32:33
添加此函数以获取数据:
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<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());
}
});在我的示例中,我检索注释。您可以在想要检索的任何内容中对其进行更改。
发布于 2019-01-12 20:43:28
要仅获取对应于特定用户的药物,您需要查询数据库两次。一次获取药品in,第二次获取药品的详细信息,如以下代码行所示:
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"上面的代码也适用于此结构。
https://stackoverflow.com/questions/54153897
复制相似问题