如何更新Firestore中包含字符串与整数类型字段的文档?
解决Firestore整数类型字段无法更新的问题
嗨,这个问题的原因很直观——你当前把cost字段的值以字符串类型写入Firestore,但你的集合里cost是定义为整数类型的,类型不匹配就导致这个字段的更新失效了。
修复步骤
核心是把EditText中获取的文本转换成整数类型,再存入Firestore,同时别忘了处理可能的格式异常(比如用户输入非数字内容的情况):
- 转换字符串为整数:将
edtCost.getText().toString()转换成Integer或Long类型(根据你Firestore里cost字段的实际整数类型选择,比如如果是长整型就用Long.parseLong())。 - 添加异常处理:避免用户输入非数字内容时抛出
NumberFormatException导致崩溃。
修改后的完整代码
FirebaseFirestore firestore = FirebaseFirestore.getInstance(); final CollectionReference colRef = firestore.collection("kontrakan"); colRef.whereEqualTo("owner", OWNER_NAME).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (QueryDocumentSnapshot document : task.getResult()) { Map<Object, Object> map = new HashMap<>(); // 泛型改为Object,兼容字符串和整数类型 map.put("address", edtAddress.getText().toString()); // 处理cost字段的类型转换与异常 try { int costValue = Integer.parseInt(edtCost.getText().toString().trim()); map.put("cost", costValue); } catch (NumberFormatException e) { // 输入非数字时提示用户,终止当前循环避免错误写入 Toast.makeText(getApplicationContext(), "请输入有效的数字作为费用", Toast.LENGTH_SHORT).show(); return; } colRef.document(document.getId()).set(map, SetOptions.merge()); Toast.makeText(getApplicationContext(), "Detail has been successfully updated.", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getApplicationContext(), "Cannot update detail.", Toast.LENGTH_SHORT).show(); } } });
关键说明
- Firestore是强类型数据库,字段的类型必须严格匹配:如果集合里
cost是整数类型,你传入字符串类型的值时,Firestore会忽略这个字段的更新操作,不会覆盖原有类型不匹配的字段。 - 把
Map<Object, String>改成Map<Object, Object>是因为现在map里既有字符串(address)又有整数(cost),泛型需要兼容这两种类型。 - 加上
trim()是为了去除用户输入的前后空格,避免因为空格导致的转换失败。
内容的提问来源于stack exchange,提问作者anta40
相关产品推荐
相关产品推荐

