使用 FirestoreRecyclerAdapter 时如何获取 Firestore 文档 ID?
Posted
技术标签:
【中文标题】使用 FirestoreRecyclerAdapter 时如何获取 Firestore 文档 ID?【英文标题】:How do I get the Firestore document ID when using FirestoreRecyclerAdapter? 【发布时间】:2018-10-15 08:33:03 【问题描述】:我正在使用 Firestore 存储“图表”集合。我需要查询集合以获取所有具有登录用户 ID 的图表。我有一个 FirebaseRecyclerAdapter,它显示了相应的图表(查询通过 FirestoreRecyclerOptions 传入)。
但是,我需要访问每个图表的文档密钥,但我不知道如何获取该信息。理想情况下,一旦从数据库中检索到图表,我想将其设置为图表模型中的变量,但“地图”似乎没有提供将文档键映射到模型中的值的方法.如果无法做到这一点,那么另一种解决方案就是在 BindViewHolder 中检索它并将其存储在不可见的视图中以供以后读取。
在我的主要活动中,我有:
FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
.setQuery(mChartsQuery, Chart.class)
.build();
mAdapter = new ChartListAdapter(recyclerOptions, this.getActivity());
mChartsQuery 在哪里获取具有特定用户 ID 的图表。
图表是这样创建的(用户在表单字段中输入了“nameString”):
Map<String, Object> newChart = new HashMap<>();
newChart.put("uid", userId);
newChart.put("name", nameString);
mDatabase.collection("charts")
.add(newChart)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() ...);
我的 ChartListAdapter 类是:
public class ChartListAdapter
extends FirestoreRecyclerAdapter<Chart, ChartViewHolder>
public ChartListAdapter(FirestoreRecyclerOptions recyclerOptions)
super(recyclerOptions);
@Override
protected void onBindViewHolder(ChartViewHolder holder, int position, Chart model)
// THIS IS WHERE I NEED THE DOCUMENT ID, SO I CAN
// PASS IT INTO THE INTENT AS EXTRA_CHART_KEY
// Set click listener for the chart
holder.itemView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent(getActivity(), ChartViewActivity.class);
intent.putExtra(ChartViewActivity.EXTRA_CHART_KEY, chartKey);
startActivity(intent);
);
// Bind Chart to ViewHolder
holder.bindToChart(model);
@Override
public ChartViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_chart, parent, false);
return new ChartViewHolder(view);
所以,我需要能够在 onBindViewHolder 中检索文档 ID。我找到了一个说使用getSnapshots().get(position).getKey();
的解决方案
但getSnapshots().get(position)
只是检索一个图表,其中没有设置密钥。
【问题讨论】:
【参考方案1】:找到解决方案...在我使用的 onBindViewHolder 中
getSnapshots().get(position).getKey();
但应该是这样的
getSnapshots().getSnapshot(position).getId();
正确的版本可以正常工作,并获得文档 ID。
【讨论】:
非常感谢,这对我有用。在 Kotlin 中,这将是 snapshots.getSnapshot(position).id【参考方案2】:在 firebaseui 5.0.0 中,“getSnapshots()”不存在。在 onBindViewHolder 你必须使用..
getItem(position).getId()
【讨论】:
【参考方案3】:应该是这一行,你可以从你的 logcat 中实际记录和检查
getSnapshots().getSnapshot(position).getId();
Log.i("chartKey==", String.valueOf(getSnapshots().getSnapshot(position).getId();))
如果需要的话,你可以把它转换成一个字符串;
String chartKey= getSnapshots().getSnapshot(position).getId();
Log.i("chartKey==",chartKey )
【讨论】:
【参考方案4】:我正在使用com.firebaseui:firebase-ui-firestore:6.2.1
,但似乎getSnapshots()
仍然可以访问,所以只需在onBindViewHolder
中使用这些
snapshots.getSnapshot(position).id
看起来像这样:
// Kotlin
override fun onBindViewHolder(holder: MyHolder, position: Int)
// ...
holder.itemView.setOnClickListener _ ->
// ...
snapshots.getSnapshot(position).id
Logcat 输出:
2020-05-19 23:10:58.595 14607-14607/com.app I/TESTTT: EFaJlMVKCcOLB1PvtQVg =>
2020-05-19 23:10:58.598 14607-14607/com.app I/TESTTT: XdnrhZiURgqwk2vvoJS9 =>
2020-05-19 23:10:58.600 14607-14607/com.app I/TESTTT: sCPpsMVfYw285tFZ4neS =>
2020-05-19 23:10:58.602 14607-14607/com.app I/TESTTT: AoQjstzjIKlFpvDxNxWS =>
2020-05-19 23:11:04.745 14607-14607/com.app I/TESTTT: onClickEvent Doc ID: EFaJlMVKCcOLB1PvtQVg
2020-05-19 23:11:13.963 14607-14607/com.app I/TESTTT: onClickEvent Doc ID: XdnrhZiURgqwk2vvoJS9
2020-05-19 23:11:17.061 14607-14607/com.app I/TESTTT: onClickEvent Doc ID: AoQjstzjIKlFpvDxNxWS
2020-05-19 23:11:19.245 14607-14607/com.app I/TESTTT: onClickEvent Doc ID: sCPpsMVfYw285tFZ4neS
【讨论】:
以上是关于使用 FirestoreRecyclerAdapter 时如何获取 Firestore 文档 ID?的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)