首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firebase UI:解决方案是从子节点接收所有键,并使用它从另一个节点接收信息并将其填充到Recyclerview中?

Firebase UI:解决方案是从子节点接收所有键,并使用它从另一个节点接收信息并将其填充到Recyclerview中?
EN

Stack Overflow用户
提问于 2019-01-12 04:53:33
回答 2查看 258关注 0票数 2

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

DB-Structure:

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

代码语言:javascript
复制
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();
}

当我使用这段代码时,我得到了每个用药计划,但我只想要用户的具体计划。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-12 05:32:33

添加此函数以获取数据:

代码语言:javascript
复制
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());
    }
});

在此之后,添加以下代码以获取第二个数据信息:

代码语言:javascript
复制
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());
    }
});

在我的示例中,我检索注释。您可以在想要检索的任何内容中对其进行更改。

票数 1
EN

Stack Overflow用户

发布于 2019-01-12 20:43:28

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

代码语言:javascript
复制
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中的输出将为:

代码语言:javascript
复制
Aspirin
Paracetamol

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

代码语言:javascript
复制
Firebase-root
   |
   --- User
        |
        --- R3
            |
            --- lastname: "Hirsch"
            |
            --- medication
            |      |
            |      --- 1234: true
            |      |
            |      --- assf12: true
            |
            --- name: "Rob"

上面的代码也适用于此结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54153897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档