Firebase数据查询主键匹配失败问题排查及代码优化请求
Firebase数据查询匹配失败修复方案
问题核心原因
代码中查询的字段名与Firebase数据库实际字段名大小写不匹配,Firebase Realtime Database对字段名大小写敏感,导致查询条件无法匹配到目标数据。例如数据库中字段为aadhaarNumber,但代码中使用了aadharnumber,二者命名不一致导致匹配失败。
修复后的完整代码
package com.example.emergencyconnect; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.Query; import com.google.firebase.database.ValueEventListener; public class Hospital_personal_information extends AppCompatActivity { private EditText TextAadhaar, TextVoterId, TextDrivingLicense, TextVehicleNumber; private Button btnSearch; private DatabaseReference databaseReference; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hospital_personal_information); // Initialize Firebase Database reference databaseReference = FirebaseDatabase.getInstance().getReference("users"); // Initialize EditText fields and Button TextAadhaar = findViewById(R.id.TextAadhaar); TextVoterId = findViewById(R.id.TextVoterId); TextDrivingLicense = findViewById(R.id.TextDrivingLicense); TextVehicleNumber = findViewById(R.id.TextVehicleNumber); btnSearch = findViewById(R.id.btnSearch); // Set OnClickListener for the search button btnSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { searchEmergencyContacts(); } }); } private void searchEmergencyContacts() { // Get input from EditText fields String aadhaar = TextAadhaar.getText().toString().trim(); String voterId = TextVoterId.getText().toString().trim(); String drivingLicense = TextDrivingLicense.getText().toString().trim(); String vehicleNumber = TextVehicleNumber.getText().toString().trim(); // Determine which query to use based on provided input Query query = null; if (!TextUtils.isEmpty(aadhaar)) { query = databaseReference.orderByChild("aadhaarNumber").equalTo(aadhaar); } else if (!TextUtils.isEmpty(voterId)) { query = databaseReference.orderByChild("voterId").equalTo(voterId); } else if (!TextUtils.isEmpty(drivingLicense)) { query = databaseReference.orderByChild("drivingLicense").equalTo(drivingLicense); } else if (!TextUtils.isEmpty(vehicleNumber)) { query = databaseReference.orderByChild("vehicleNumber").equalTo(vehicleNumber); } else { Toast.makeText(this, "请至少输入一个查询值", Toast.LENGTH_SHORT).show(); return; } // Execute the query query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { // Check if data exists for the provided input if (dataSnapshot.exists()) { // Get the first matching record DataSnapshot record = dataSnapshot.getChildren().iterator().next(); String patientKey = record.getKey(); // Get the unique Firebase key // Pass the key to the next activity Intent intent = new Intent(Hospital_personal_information.this, Hospital_Patient_personal_details.class); intent.putExtra("patient_key", patientKey); // Pass the key startActivity(intent); // Start the second activity } else { Toast.makeText(Hospital_personal_information.this, "未找到匹配记录", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { Toast.makeText(Hospital_personal_information.this, "错误:" + databaseError.getMessage(), Toast.LENGTH_SHORT).show(); } }); } }
额外注意事项
- 确保Firebase数据库规则允许当前应用读取
users节点数据,否则会触发权限错误; - 可对用户输入做格式校验(如去除空格、统一大小写),避免因输入格式问题导致匹配失败;
- 若需支持多条件组合查询,可遍历数据快照逐一验证多个字段,而非仅依赖单个
orderByChild查询; - 建议添加加载状态提示,提升用户体验。
内容的提问来源于stack exchange,提问作者NANDISH C 2007023
相关产品推荐
相关产品推荐

