You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现用户通过指定文档名从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:39:02