Android Kotlin сохраняет класс данных в базе данных Firebase - PullRequest
0 голосов
/ 28 октября 2018

Я работаю над приложением Android в Kotlin, которое интегрирует Firebase.Теперь я хочу сохранить свои данные (Kotlin data class) в базе данных Firebase.

Классы данных:

@Parcelize
data class Trip(
    val fromAddress: String,
    val toAddress: String,
    val fromLocation: String,
    val toLocation: String,
    val orderUid: String
) : Parcelable

@Parcelize
data class Order(val trip: Trip, val date: Date, var status: OrderStatus, val userUid: String) : Parcelable {
    var pickUpDate: Date? = null
    var dropOffDate: Date? = null
    var price: Double? = null

}

Операция записи в базу данных Fireabase:

fun createNewOrder(
    fromAddress: String,
    toAddress: String,
    fromLocation: Location,
    toLocation: Location
) {
    val fromGeoLocation = fromLocation.convertToGeoLocation()
    val toGeoLocation = toLocation.convertToGeoLocation()
    val userUid = sharedPreferences[CURRENT_USER_UID_KEY, ""]!!
    val orderKey = databaseReference.child(DB_ORDERS_KEY).push().key
    val tripKey = databaseReference.child(DB_TRIPS_KEY).push().key
    val trip = orderKey?.let { createNewTrip(fromAddress, toAddress, it) }
    val order = trip?.let { Order(it, Date(), OrderStatus.PENDING, userUid) }

    if (trip != null && order != null && !userUid.isNullOrEmpty()) {
        ordersGeoFire.setLocation(trip.fromGeoLocation, fromGeoLocation)
        ordersGeoFire.setLocation(trip.toGeoLocation, toGeoLocation)
        val allData = mutableMapOf<String, Any>()
        allData["/$DB_TRIPS_KEY/$tripKey"] = trip?.convertToMap()
        allData["/$DB_ORDERS_KEY/$orderKey"] = order?.convertToMap()
        allData["/$DB_USERS_KEY/$userUid/$DB_ORDERS_KEY/$orderKey"] = true
        databaseReference.updateChildren(allData)
    }
}

Я получилэта ошибка:

com.google.firebase.database.DatabaseException: не найдены свойства для сериализации в классе kotlin.Unit

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Это была моя ошибка, потому что я забыл добавить return type в свои расширения convertToMap функции.Теперь они выглядят так:

fun Trip.convertToMap(): MutableMap<String, Any> {
    val map = mutableMapOf<String, Any>()
    map["fromAddress"] = fromAddress
    map["toAddress"] = toAddress
    map["fromGeoLocation"] = fromGeoLocation
    map["toGeoLocation"] = toGeoLocation
    map["orderUid"] = orderUid
    return map
}

А также спасибо @Alex Mamo за его ответ, он помогает мне в моем расследовании.

Теперь мой код выглядит так и работает нормально:

@Parcelize
data class Trip(
    var fromAddress: String = "",
    var toAddress: String = "",
    var fromGeoLocation: String = "",
    var toGeoLocation: String = "",
    var orderUid: String = ""
) : Parcelable

@Parcelize
data class Order(
    var trip: Trip? = null,
    var date: Date? = null,
    var status: OrderStatus? = null,
    var userUid: String = ""
) : Parcelable {
    var pickUpDate: Date? = null
    var dropOffDate: Date? = null
    var price: Double? = null
}

fun createNewOrder(
    fromAddress: String,
    toAddress: String,
    fromLocation: Location,
    toLocation: Location
): LiveData<Order> {
    orderLiveData = MutableLiveData()
    orderLiveData.value = null
    val userUid = sharedPreferences[CURRENT_USER_UID_KEY, ""]!!
    val orderKey = databaseReference.child(DB_ORDERS_KEY).push().key
    val tripKey = databaseReference.child(DB_TRIPS_KEY).push().key
    val trip = orderKey?.let { createNewTrip(fromAddress, toAddress, fromLocation, toLocation, it) }
    val order = trip?.let { Order(it, Date(), OrderStatus.PENDING, userUid) }

    if (trip != null && order != null && !userUid.isNullOrEmpty()) {
        val allData = mutableMapOf<String, Any>()
        allData["/$DB_TRIPS_KEY/$tripKey"] = trip.convertToMap()
        allData["/$DB_ORDERS_KEY/$orderKey"] = order.convertToMap()
        allData["/$DB_USERS_KEY/$userUid/$DB_ORDERS_KEY/$orderKey"] = true
        databaseReference.updateChildren(allData) { databaseError, databaseReference ->
            if (databaseError == null) orderLiveData.value = order
        }
    }

    return orderLiveData
}

Надеюсь, это будет полезно

0 голосов
/ 29 октября 2018

Проблема в вашем коде состоит в том, что поля внутри вашего Trip класса не инициализированы.Рекомендуемый способ создания класса модели:

class Trip(
        val displayName: String = "",
        val email: String = "",
        val photoUrl: String = "",
        val userId: String = ""
)

Это только то, что вам нужно.И способ создать новый объект вашего Trip класса:

val trip = Trip(displayName, email, photoUrl, userId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...