使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)