Android Kotlin Firebase Firestore数据提交始终为Null问题求助
排查Firestore数据显示为Null的问题
结合你提供的代码片段,以下是几个可能导致数据在Firestore控制台显示为Null的原因及修复方案:
1. 地理坐标参数错误(导致geo_location值异常)
在getDeviceLocation方法中,创建GeoPoint时错误地传入了两次latitude:
val geoPoint = GeoPoint(location.latitude, location.latitude)
正确写法应传入纬度和经度:
val geoPoint = GeoPoint(location.latitude, location.longitude)
虽然这可能不是数据显示Null的直接原因,但会导致地理坐标数据错误,建议优先修正。
2. 异步操作顺序问题(导致users字段为Null)
getUserDetails是异步操作(Firestore的get()方法异步执行),而你在getDeviceLocation中直接调用saveUserLocation,大概率在userslocation.users = user执行前,保存操作就已完成,导致users字段未被赋值,最终存储为Null。
修复方案:
确保获取用户详情完成后再执行位置保存,可调整代码逻辑:
- 方式一:将
saveUserLocation()移至getUserDetails的addOnSuccessListener中 - 方式二:使用协程处理异步流程,保证执行顺序
示例(方式一):
private fun getDeviceLocation() { if (checkPermissions()) { if (isLocationEnabled()) { fusedLocationProviderClient.lastLocation.addOnCompleteListener { task -> val location = task.result if (location == null) { requestNewLocationData() } else { val geoPoint = GeoPoint(location.latitude, location.longitude) Log.d(TAG, "UserLocation" + geoPoint.latitude) Log.d(TAG, "UserLocation" + geoPoint.longitude) userslocation.geo_location = geoPoint userslocation.timestamp = null // 先获取用户详情,再触发保存 getUserDetails { saveUserLocation() } } } } else { Toast.makeText(requireContext(), "Turn on location", Toast.LENGTH_LONG).show() val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) startActivity(intent) } } } // 修改getUserDetails,添加完成回调 private fun getUserDetails(onComplete: () -> Unit) { firestoreDatabase = FirebaseFirestore.getInstance() auth = FirebaseAuth.getInstance() val userrefd = firestoreDatabase.collection(USER_DETAILS) .document(auth.uid.toString()) userrefd.get().addOnSuccessListener { val user = it.toObject(Users::class.java) Log.i("firebaseImp", "Got value ${it.data}" + user) userslocation.users = user onComplete() // 获取完成后执行保存 } .addOnFailureListener { Log.e("firebaseImp", "Error getting data", it) } }
3. saveUserLocation方法可能存在问题
你未提供saveUserLocation的实现,以下是常见错误点:
- 未正确将
userslocation对象写入Firestore - 文档ID或集合名称错误(比如常量引用错误)
- 数据类字段与Firestore字段映射不匹配(比如空值处理、字段名大小写)
检查建议:
确保saveUserLocation实现符合规范,示例如下:
private fun saveUserLocation() { firestoreDatabase.collection(USER_LOCATION) .document(auth.uid.toString()) // 用用户ID作为唯一文档ID .set(userslocation) .addOnSuccessListener { Log.d(TAG, "User location saved successfully") } .addOnFailureListener { e -> Log.w(TAG, "Error saving user location", e) } }
4. 数据类空值默认值问题
UserLocation类中geo_location默认值为null,如果保存前未正确赋值,也会导致Firestore中显示为Null。需确保调用saveUserLocation前,geo_location已被正确设置。
内容的提问来源于stack exchange,提问作者Dkathayat1
相关产品推荐
相关产品推荐

