来自 Android 的 Firebase 复杂查询导致错误
Firebase complex query from Android results in ERROR
我们有一个复杂的数据结构存储在 Firebase 实时数据库中,并按照 Firebase 的官方方式使用 MVVM + LiveData 检索数据。我们正在尝试将生成的数据快照(用户列表)映射到 Kotlin 数据 class 但结果是 没有定义无参数构造函数 。完整错误如下:
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 = ""
)
如您所见,数据的每个元素 class 都根据 SOF 讨论进行了初始化,以克服上述 firebase 异常。运气不好,我们怀疑数据 class 和后端结构之间的映射存在差异。
下面贴出疑似区域:
它的等价数据class是:
@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 = ""
)
它的等价数据class是:
@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 = ""
)
我们认为数据 class 和数据库结构之间的映射存在差异,任何将动态节点转换为数据 class 的线索或建议将不胜感激。
提前感谢您阅读这么长的文章。
您忘记为以下项提供初始值:
var paymentInfoRequired: String,
这会阻止 Kotlin 为该数据创建无参数构造函数 class。
我们有一个复杂的数据结构存储在 Firebase 实时数据库中,并按照 Firebase 的官方方式使用 MVVM + LiveData 检索数据。我们正在尝试将生成的数据快照(用户列表)映射到 Kotlin 数据 class 但结果是 没有定义无参数构造函数 。完整错误如下:
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 = ""
)
如您所见,数据的每个元素 class 都根据 SOF 讨论进行了初始化,以克服上述 firebase 异常。运气不好,我们怀疑数据 class 和后端结构之间的映射存在差异。
下面贴出疑似区域:
它的等价数据class是:
@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 = ""
)
它的等价数据class是:
@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 = ""
)
我们认为数据 class 和数据库结构之间的映射存在差异,任何将动态节点转换为数据 class 的线索或建议将不胜感激。
提前感谢您阅读这么长的文章。
您忘记为以下项提供初始值:
var paymentInfoRequired: String,
这会阻止 Kotlin 为该数据创建无参数构造函数 class。