从Firebase Firestore取数时遇‘Field 'dwell time'非java.lang.Number’错误
问题分析与修复方案:Firestore字段“dwell time”无法用getLong()读取的错误
可能的原因及对应修复方法:
1. 字段名不匹配
代码中使用的字段名和Firestore控制台中的字段名必须完全一致,包括空格、大小写。比如Firestore中是带空格的dwell time,代码里不能写成dwellTime或者dwell_time。
修复:
严格核对代码中的字段字符串:
// 确保字段名和Firestore中完全一致 Long dwellTime = document.getLong("dwell time");
2. Firestore中字段是浮点型(Double)而非整型(Long)
Firestore的数字类型包含整型和浮点型,如果该字段存储的是小数(比如2.5),直接用getLong()会触发类型不匹配错误——因为getLong()仅支持读取整型数字。
修复:
先读取为Number类型,再转换为Long;或者先读取为Double再转Long:
// 方法1:通过Number中转 Number dwellTimeNum = document.getNumber("dwell time"); Long dwellTime = dwellTimeNum != null ? dwellTimeNum.longValue() : null; // 方法2:读取为Double后转换 Double dwellTimeDouble = document.getDouble("dwell time"); Long dwellTime = dwellTimeDouble != null ? dwellTimeDouble.longValue() : null;
3. 目标文档中字段缺失或为null
即使大部分文档的dwell time是数字类型,个别文档可能存在字段缺失或值为null的情况,调用getLong()时会抛出异常。
修复:
先检查字段是否存在且非null:
if (document.contains("dwell time")) { Number dwellTimeNum = document.getNumber("dwell time"); if (dwellTimeNum != null) { Long dwellTime = dwellTimeNum.longValue(); // 后续业务逻辑 } else { // 处理字段为null的情况 } } else { // 处理字段不存在的情况 }
4. 字段实际为字符串类型(误判)
如果写入数据时错误地将数字以字符串形式存储(比如存了"123"而非123),Firestore控制台可能显示类似数字的内容,但实际类型是字符串,这也会触发该错误。
修复:
在Firestore控制台中确认字段类型:数字类型为蓝色标识,字符串为黑色。如果是字符串类型,需要修正写入逻辑,确保存储的是数字而非字符串,同时更新已有文档的字段类型。
内容的提问来源于stack exchange,提问作者ilyes moawy
相关产品推荐
相关产品推荐

