如何实现用户通过指定文档名从Firestore查询对应数据的功能?
修复方案
1 修改布局文件 activity_main.xml
给文本输入框添加ID,新增查询按钮用于触发查询操作,修改后完整代码如下:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/value1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.585" /> <TextView android:id="@+id/value2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.873" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.585" /> <TextView android:id="@+id/value3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.162" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.586" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout" android:layout_width="383dp" android:layout_height="wrap_content" android:layout_marginTop="34dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/et_doc_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter your search here..." /> </com.google.android.material.textfield.TextInputLayout> <Button android:id="@+id/btn_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询" android:layout_marginTop="16dp" app:layout_constraintTop_toBottomOf="@id/textInputLayout" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout>
2 修改MainActivity.kt代码
修正导入拼写错误,替换原有全集合查询逻辑为按用户输入的文档名查询单文档,修改后完整代码如下:
package com.example.test import android.content.ContentValues.TAG import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.Button import android.widget.TextView import android.widget.Toast import com.google.android.material.textfield.TextInputEditText import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val db = Firebase.firestore val value1= findViewById<TextView>(R.id.value1) val value2= findViewById<TextView>(R.id.value2) val value3= findViewById<TextView>(R.id.value3) val etDocName = findViewById<TextInputEditText>(R.id.et_doc_name) val btnSearch = findViewById<Button>(R.id.btn_search) btnSearch.setOnClickListener { val docName = etDocName.text.toString().trim() if (docName.isEmpty()) { Toast.makeText(this, "请输入文档名称", Toast.LENGTH_SHORT).show() return@setOnClickListener } // 直接查询指定文档,无需拉取整个集合 db.collection("storage").document(docName) .get() .addOnSuccessListener { document -> if (document.exists()) { // 字段为数值类型,直接转为String展示 value1.text = document.getLong("value1").toString() value2.text = document.getLong("value2").toString() value3.text = document.getLong("value3").toString() } else { Toast.makeText(this, "该文档不存在", Toast.LENGTH_SHORT).show() } } .addOnFailureListener { exception -> Log.w("notexisting", "Error getting documents.", exception) Toast.makeText(this, "查询失败:${exception.message}", Toast.LENGTH_SHORT).show() } } } }
改动说明
- 修正了Firebase导入的拼写错误,将
com.google.firebase.ktf.Firebase改为com.google.firebase.ktx.Firebase,解决编译报错 - 新增查询触发逻辑,仅在用户输入内容点击查询后才发起请求,避免启动时拉取整个集合的冗余请求
- 直接通过文档ID查询对应文档,查询效率更高,符合业务需求
- 增加了输入校验、文档不存在、查询失败的提示处理,交互更完善
- 适配数值类型字段的读取逻辑,避免用
getString()读取数值返回null的问题
内容的提问来源于stack exchange,提问作者CSBossmann
相关产品推荐
相关产品推荐

