【问题标题】:Firebase complex query from Android results in ERROR来自 Android 的 Firebase 复杂查询导致错误
【发布时间】:2020-02-06 08:07:46
【问题描述】:

我们在 Firebase 实时数据库中存储了一个复杂的数据结构,并遵循 Firebase 使用 MVVM + LiveData 检索数据的官方方式。我们正在尝试将生成的数据快照(用户列表)映射到 Kotlin 数据类,但结果为 没有定义无参数构造函数。下面的完整错误:

  com.google.firebase.database.DatabaseException: Class com.myapp.android.firebase.dto.ProfessionalDetails does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped.
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(com.google.firebase:firebase-database@@19.1.0:552)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(com.google.firebase:firebase-database@@19.1.0:545)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@19.1.0:415)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.1.0:214)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@19.1.0:79)

专业详情如下:

@Keep
@IgnoreExtraProperties
data class ProfessionalDetails constructor(
    var bookings: Bookings = Bookings(),
    var business_details: BusinessDetails = BusinessDetails(),
    var clientProvider: String = "",
    var clientUserId: String = "",
    var country: String = "",
    var created: String = "",
    var device_id: String = "",
    var diary: Diary = Diary(),
    var first_name: String = "",
    var hide_profile: String = "",
    var last_name: String = "",
    var mobile_number: String = "",
    var paymentInfoRequired: String,
    var payment_info: PaymentInfo = PaymentInfo("", "", ""),
    var proEmail: String = "",
    var proPwd: String = "",
    var profile_picture: String = "",
    var profile_picture_url: String = "",
    var profile_thumbnail: String = "",
    var profile_thumbnail_url: String = "",
    var service_categories: String = "",
    var services: List<ProfessionalServices> = emptyList(),
    var signup_complete: String = "",
    var signup_step: String = "",
    var terms: String = "",
    var user_type: String = ""
)

您注意到数据类的每个元素都根据 SOF 讨论进行初始化,以克服上述 firebase 异常。运气不好,我们怀疑数据类和后端结构之间的映射存在差异。

下面粘贴疑似区域:

它的等价数据类是:

@Keep
@IgnoreExtraProperties
data class Bookings constructor(
    var booking_requests: List<BookingRequests> = emptyList()
)

@Keep
data class BookingRequests constructor(
    var date: String = "",
    var payment_currency: String = "",
    var professional_user_id: String = "",
    var service_duration: String = "",
    var service_name: String = "",
    var service_price: String = "",
    var status: String = "",
    var time: String = ""
)

它的等价数据类是:

@Keep
@IgnoreExtraProperties
data class Diary constructor(
    var booking_id: String = "",
    var client_first_name: String = "",
    var client_last_name: String = "",
    var client_user_id: String = "",
    var created_by: String = "",
    var date: String = "",
    var duration: String = "",
    var end_time: String = "",
    var payment_currency: String = "",
    var service_name: String = "",
    var service_price: String = "",
    var start_time: String = "",
    var title: String = ""
)

我们认为数据类和数据库结构之间的映射存在差异,任何将动态节点转换为数据类的线索或建议将不胜感激。

提前感谢您阅读这么长的文章。

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database data-class


    【解决方案1】:

    您忘记为以下各项提供初始值:

    var paymentInfoRequired: String,
    

    这会阻止 Kotlin 为该数据类创建无参数构造函数。

    【讨论】:

    • 道格,很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多