Сложный запрос Firebase из Android приводит к ошибке - PullRequest
1 голос
/ 09 октября 2019

У нас есть сложная структура данных, которая хранится в базе данных реального времени 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)

ProfessionalDetails, как показано ниже:

@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. Не повезло, мы подозреваем несоответствие в отображении между классом данных и структурой бэкэнда.

Подозреваемые области вставлены ниже:

Bookings node

и его эквивалентный класс данных:

@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 = ""
)

Diary mode

и его эквивалентный класс данных:

@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 = ""
)

Мы считаем, что существует несоответствие в отображении между классом данных и структурой базы данных. Любая возможность преобразования динамического узла в класс данных или предложения будут высоко оценены.

Заранее благодарим за прочтение такой длинной записи.

1 Ответ

2 голосов
/ 09 октября 2019

Вы забыли указать начальное значение для:

var paymentInfoRequired: String,

Это не позволяет Kotlin создать конструктор без аргументов для этого класса данных.

...