Android的Firestore将2个集合加入回收者视图

时间:2019-02-23 14:03:08

标签: android firebase google-cloud-firestore firebaseui

我有一个用户集合,其中包含uId,名称,照片

我有一个访问集合,其中包含uId,userId,位置

我有一个recyclerview,我想在其中显示用户名和照片的位置

我可以使用参考字段类型吗?如果是这样,Firestore将如何知道如何链接visits.userId == users.uId?

也许我首先需要查询所有访问,然后查询相关用户,但有两件事:

  1. 这意味着查询很多次。

  2. 我不明白如何将联接的集合收集到基于一个查询的适配器中?

请咨询 谢谢

当前代码

visitsList = db.collection("visitsList");
Query query = visitsList.whereEqualTo("userId",prefs.getString("id","")).orderBy("visitDate", Query.Direction.ASCENDING);
FirestoreRecyclerOptions<AVisit> options = new FirestoreRecyclerOptions.Builder<AVisit>().setQuery(query, AVisit.class).build();
adapter = new VisitsListAdapter(options, VisitsListActivity.this);
RecyclerView rv = findViewById(R.id.rvVisitsList);
rv.setHasFixedSize(true);
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(adapter);

该代码是从集合中进行的简单查询,不确定如何从该集合的userId字段中获取名称和照片。

1 个答案:

答案 0 :(得分:2)

  

我可以使用参考字段类型吗?

是的,您可以使用参考字段。

  

如果是这样,Firestore将如何知道如何链接visits.userId == users.uId?

Firestore结果始终来自单个集合(目前)。当您从访问集合中读取内容时,它不会自动将用户集合中的文档加入。您将必须自己执行此操作。

这确实意味着您将要执行多次读取,但是它通常不像您想象的那样慢。参见Google Firestore - how to get document by multiple ids in one round trip?


更新:要在访问列表中显示用户个人资料中的数据,有两个主要选项:

  1. populateViewcustom parseSnapshot implementation中加载其他用户文档。

  2. 在visits集合中复制相关的用户数据(这在NoSQL数据库中非常正常)。另请参见Alex在这里的回答:indexed query with FirestoreRecyclerAdapter