Firebase实时数据库未保存数据:添加LatLng非空判断后写入失败
问题排查步骤
- 首先确认if判断是否真的执行
你的代码加入非空判断后没有执行写入,大概率是pickupLatLng或destinationLatLng在代码执行到此处时为null,直接跳过了代码块。你可以在if判断前插入日志确认变量状态:
要是打印结果有任意一个为true,你需要检查这两个变量的赋值时机,确保在触发数据库写入前,已经完成了定位、目的地选点的赋值操作。Log.d("CHECK_NULL", "pickup是否为空: " + (pickupLatLng == null) + " | destination是否为空: " + (destinationLatLng == null)); if (pickupLatLng != null && destinationLatLng != null) { // 原有逻辑 } - 检查代码块内的变量是否有非法值
rideDistance如果未初始化、值为null的话,Firebase实时数据库不支持写入null值,会触发写入失败。你可以同样加日志确认rideDistance是否有合法值。 - 补全完成回调的错误打印
你之前加完成回调没效果大概率是没打印错误信息,修改回调逻辑如下:
所有写入失败的原因都会在error日志中明确展示,比如权限不足、数据格式非法等。historyRef.child(requestId).updateChildren(map, new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError error, DatabaseReference ref) { if (error != null) { Log.e("FIREBASE_ERR", "写入失败原因:" + error.getMessage()); } else { Log.d("FIREBASE_SUCCESS", "写入成功"); } } }); - 检查数据库规则权限
确认你的实时数据库规则是否开放了location、distance字段的写入权限,很多人只会配置基础字段的写入权限,新增字段后没有更新规则会被拦截写入。 - 替换路径写法测试
你用斜杠分隔的路径写法本身是支持的,但可以替换为嵌套HashMap的写法避免路径解析异常:HashMap<String, Object> fromLoc = new HashMap<>(); fromLoc.put("lat", pickupLatLng.latitude); fromLoc.put("lng", pickupLatLng.longitude); HashMap<String, Object> toLoc = new HashMap<>(); toLoc.put("lat", destinationLatLng.latitude); toLoc.put("lng", destinationLatLng.longitude); HashMap<String, Object> locationMap = new HashMap<>(); locationMap.put("from", fromLoc); locationMap.put("to", toLoc); map.put("location", locationMap);
内容的提问来源于stack exchange,提问作者kCoderp
相关产品推荐
相关产品推荐

