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

如何更新Firestore中包含字符串与整数类型字段的文档?

解决Firestore整数类型字段无法更新的问题

嗨,这个问题的原因很直观——你当前把cost字段的值以字符串类型写入Firestore,但你的集合里cost是定义为整数类型的,类型不匹配就导致这个字段的更新失效了。

修复步骤

核心是把EditText中获取的文本转换成整数类型,再存入Firestore,同时别忘了处理可能的格式异常(比如用户输入非数字内容的情况):

  1. 转换字符串为整数:将edtCost.getText().toString()转换成Integer或Long类型(根据你Firestore里cost字段的实际整数类型选择,比如如果是长整型就用Long.parseLong())。
  2. 添加异常处理:避免用户输入非数字内容时抛出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:27:48