如何将条码扫描结果作为Firestore文档ID查询对应文档
问题解决方法
核心问题原因
你提前在全局初始化DocumentReference的逻辑错误:类加载时documentId还未赋值,默认是null,你创建的noteRef实际指向ID为"null"的不存在文档,自然查询不到结果。
修改步骤
- 清理无用全局变量,删掉错误的全局
noteRef定义、Result类型的result和documentId变量,不需要提前存储这些值。 - 条码扫描结果是异步返回的,必须在
onDecoded回调拿到扫描值后,动态创建对应文档的引用再执行查询。 - 注意
CodeScanner的解码回调默认运行在子线程,更新UI需要切到主线程。
完整可运行修改代码示例
全局变量部分
// Initialise private TextView textViewData; private CodeScanner mCodeScanner; private Button btClear; private final FirebaseFirestore db = FirebaseFirestore.getInstance(); // 自行补全你的字段常量 private static final String KEY_BRAND = "Brand"; private static final String KEY_PRODUCT = "Product"; private static final String KEY_OWNED = "Owned"; private static final String KEY_MADE = "Made"; private static final String KEY_INGREDIENTS = "Ingredients"; private static final String KEY_INFO = "Info";
扫描回调逻辑部分
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化控件 btClear = findViewById(R.id.bt_clear); textViewData = findViewById(R.id.text_view_data); CodeScannerView scannerView = findViewById(R.id.scanner_view); mCodeScanner = new CodeScanner(this, scannerView); mCodeScanner.setDecodeCallback(new DecodeCallback() { @Override public void onDecoded(final Result result) { // 切换到主线程操作UI runOnUiThread(() -> { // 获取扫描得到的条码值 String scanBarcode = result.getText(); // 动态创建对应文档的引用 DocumentReference noteRef = db.collection("Ratings").document(scanBarcode); // 执行查询 noteRef.get() .addOnSuccessListener(documentSnapshot -> { if (documentSnapshot.exists()) { String Brand = documentSnapshot.getString(KEY_BRAND); String Product = documentSnapshot.getString(KEY_PRODUCT); String Owned = documentSnapshot.getString(KEY_OWNED); String Made = documentSnapshot.getString(KEY_MADE); String Ingredients = documentSnapshot.getString(KEY_INGREDIENTS); String Info = documentSnapshot.getString(KEY_INFO); // 此处补充你自己的UI渲染逻辑 } else { textViewData.setText("未查询到该条码对应的记录"); } }) .addOnFailureListener(e -> { textViewData.setText("查询失败:" + e.getMessage()); }); }); } }); // 补充你原来的扫描启动逻辑、清除按钮逻辑等 }
额外优化建议
- 可以加条码格式校验,避免扫描到非商品条码的无效值发起无效查询
- 加查询loading提示,提升用户体验
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

