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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:20:50