从 Android 中的 Firestore 检索子集合数据
Posted
技术标签:
【中文标题】从 Android 中的 Firestore 检索子集合数据【英文标题】:Retrieve subcollection data from Firestore in Android 【发布时间】:2021-07-03 02:32:34 【问题描述】:尝试单击 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"));
);
数据库结构:
输出:
【问题讨论】:
这段代码中到底有什么不符合您的预期? 我的代码没有任何错误,但数据不会出来。我已经编辑了我的帖子,现在你可以看到我的输出了。输出 1 显示 RecyclerView,输出 2 显示当我单击其中一个时,它不显示数据。 所以你要从一项活动转到另一项活动,对吧? 是的,它是..... 感谢您一直以来的帮助,现在我明白了。 【参考方案1】:我相信您代码中的问题出在这一行:
String id = fStore.collection("Users").document(user.getUid()).collection("Diary").document().getId();
您在哪里使用.document().getId();
,但没有指定您想要哪个文档,这使得id
没有预期值,因此您在稍后执行使用该值的比较中不会得到任何结果.要解决此问题,您需要将此 Id 存储在某处并将其作为参数传递给您的 getDiary()
函数,或类似的东西。
【讨论】:
现在我知道是什么问题了,非常感谢。以上是关于从 Android 中的 Firestore 检索子集合数据的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio Firebase Firestore 无法检索字段数据
Recycler View Android中的Firestore数据[重复]
从 Flutter 中的 Firestore 检索数据后的空列表
如何使用 Flutter 中的 UserID 从 Firebase Firestore 检索数据?