繁体   English   中英

从 Android 中的 Firestore 检索子集合数据

[英]Retrieve subcollection data from Firestore in Android

尝试单击 RecyclerView 时,我一直无法从子集合“日记”中检索数据。 我想要的是当我单击 RecyclerView 时,它将显示存储在“日记”中的数据。 我的代码有什么问题?

RecyclerView Java 码:

private void setUpRecyclerView() {
    fStore = FirebaseFirestore.getInstance();
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    Query query = fStore.collection("Users").document(user.getUid()).collection("Diary").orderBy("Date", Query.Direction.ASCENDING);

    FirestoreRecyclerOptions<ModelClass> options = new FirestoreRecyclerOptions.Builder<ModelClass>()
            .setQuery(query, ModelClass.class)
            .build();

    adapters = new CustomAdapter(options,this);

    adapters.startListening();
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapters);

    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
            ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            adapters.deleteItem(viewHolder.getAdapterPosition());
        }
    }).attachToRecyclerView(recyclerView);


}

@Override
public void onItemClick(final DocumentSnapshot snapshot, int position) {
    final ModelClass diary = snapshot.toObject(ModelClass.class);
    String id = snapshot.getId();
   startActivity(new Intent(diary_user.this,onClickRecyclerViewDiary_user.class));
    Toast.makeText(diary_user.this,"Position: " + position + "ID: " + id,Toast.LENGTH_SHORT).show();

}

存储数据 Java 代码:

check.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FirebaseUser user = fAuth.getCurrentUser();
            String uid = user.getUid();
            String id = fStore.collection("Users").document(user.getUid()).collection("Diary").document().getId();
            DocumentReference df = fStore.collection("Users").document(user.getUid()).collection("Diary").document(id);
            Map<String, Object> diaryInfo = new HashMap<>();
            diaryInfo.put("Symptom", symptom.getEditText().getText().toString());
            diaryInfo.put("Note", note.getEditText().getText().toString());
            diaryInfo.put("Date", dateButton.getText().toString());
            diaryInfo.put("ID",id);

            SimpleDateFormat tf = new SimpleDateFormat("hh:mm a");
            String currentTime = tf.format(Calendar.getInstance().getTime());
            time.setText(currentTime);
            diaryInfo.put("Time", time.getText().toString());

            feeling = spinner.getSelectedItem().toString();
            diaryInfo.put("Feeling", feeling);

            df.set(diaryInfo).addOnSuccessListener(new OnSuccessListener() {
                @Override
                public void onSuccess(Object o) {
                    Toast.makeText(add_diary_user.this, "Data successfully stored", Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(add_diary_user.this, diary_user.class));
                    finish();
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(add_diary_user.this, e.toString(), Toast.LENGTH_SHORT).show();
                }
            });

        }
    });

检索数据 Java 代码:

private void getDiary() {
    fStore = FirebaseFirestore.getInstance();
    FirebaseUser user = fAuth.getCurrentUser();
    String id = fStore.collection("Users").document(user.getUid()).collection("Diary").document().getId();
    fStore.collection("Users").document(user.getUid()).collection("Diary");
            diary.whereEqualTo("ID", id)
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (DocumentSnapshot document : task.getResult()) {
                            // Do something with your retrieved documents
                            dateButton.setText((CharSequence) document.getString("Date"));
                            note.getEditText().setText((CharSequence) document.getString("Note"));
                            symptom.getEditText().setText((CharSequence) document.getString("Symptom"));
                        }
                    }
                }
            });
}

数据库结构:

在此处输入图像描述

在此处输入图像描述

Output:

在此处输入图像描述

在此处输入图像描述

我相信您的代码中的问题出在这一行:

String id = fStore.collection("Users").document(user.getUid()).collection("Diary").document().getId();

你在哪里使用.document().getId(); 但是没有指定您想要哪个文档,这使得id没有预期值,因此您在稍后执行时使用该值的比较中不会得到任何结果。 要解决这个问题,您需要将此 Id 存储在某处并将其作为参数传递给您的getDiary() function 或类似的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM