Firebase 实时数据库中的子键问题仅在发布版本中

Posted

技术标签:

【中文标题】Firebase 实时数据库中的子键问题仅在发布版本中【英文标题】:Child key issues in Firebase Realtime database only in release Version 【发布时间】:2021-12-10 20:24:34 【问题描述】:

我已将用户数据存储在 firebase 实时数据库中。问题是当我从调试 APK 存储数据时,它会写入正确的键和值。但是当请求是从发布 aab 或 APK 发送时,存储的值是正确的,但密钥与我提供的不匹配。它用 (a, b, c ....) 更改了键名。

请查看快照以获得更好的理解。第一个用户数据是从调试 APK 发送的。第二个用户数据是从发布的 APK 发送的。

这也是我的用户数据类

data class UserModel(@SerializedName("u_id") val u_id: String? = null, @SerializedName("user_name") val user_name: String? = null,
                     @SerializedName("phone_number") val phone_number: String? = null, @SerializedName("business_name") val business_name: String? = null)

这里是数据集方法

 private fun sendDataToFirebase()
        val database = Firebase.database.reference
        val userData = UserModel(u_id, user_name, phone_number, business_name)
        database.child("User").child(user.u_id).setValue(userData).addOnSuccessListener 
           // some otherscode
        
    

【问题讨论】:

另外,我试过不使用@SerializedName,但还是同样的问题。 请检查副本以了解如何解决此问题。 【参考方案1】:

SerializedName 注释由 GSON 使用,而不是由 Firebase 使用。对于 Firebase,请使用 PropertyName annotation。

但问题更可能是由 ProGuard 引起的,它正在缩小您的属性名称。您需要禁用 ProGuard 或(更有可能)从中排除您的数据类:

-keep class com.yourpackage.UserModel  *; 

或者更好:

-keep class com.yourpackage.model.**  *; 

另见:

configuring ProGuard 上的 Firebase 文档 更多search results

【讨论】:

以上是关于Firebase 实时数据库中的子键问题仅在发布版本中的主要内容,如果未能解决你的问题,请参考以下文章

文档路径SwiftUI中随机生成的Firebase子键

如何仅在 Firebase 中获取子密钥

iOS Swift 中的 firebase 实时数据库推送等价物是啥?

如何在 Firebase 中获取直接父键

更新 Firebase 中键的值

无法显示来自 firebase 实时数据库的数据,错误列表<Object?> 不是 Map<dynamic,dynamic> 的子类型