web-dev-qa-db-ja.com

Firebaseデータの逆シリアル化-スナップショットをKotlinデータクラスに

こんにちは私は次のようなKotlinデータクラスを持っています

data class User (
        @get:Exclude val gUser: Boolean,
        @get:Exclude val uid: String,
        @get:PropertyName("display_name") val displayName: String,
        @get:PropertyName("email") val email: String,
        @get:PropertyName("account_picture_url") val accountPicUrl: String,
        @get:PropertyName("provider") val provider: String
)

問題なくオブジェクトをシリアル化できます。しかし、Firebaseクエリを実行するときにオブジェクトを逆シリアル化するのに問題があります。現在、これは私がデータを取得するために行っていることです

_firebaseReference.child(getString(R.string.firebase_users_key)).child(user.uid)
        .setValue(user).addOnCompleteListener{
    _firebaseReference.child("users").child(user.uid)
            .addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onCancelled(p0: DatabaseError) {

        }

        override fun onDataChange(p0: DataSnapshot) {
            if (p0.exists()) {
                val userHash = p0.value as HashMap<*, *>
                var currentUser: User
                if (userHash[getString(R.string.provider_key)]
                        != getString(R.string.provider_google)) {
                    currentUser = User(false, p0.key!!, 
                            userHash["display_name"].toString(), 
                            userHash["email"].toString(),
                            userHash["account_picture_url"].toString(), 
                            userHash["provider"].toString())
                } else {
                    currentUser = User(true, p0.key!!, 
                            userHash["display_name"].toString(), 
                            userHash["email"].toString(), 
                            userHash["account_picture_url"].toString(), 
                            userHash["provider"].toString())
                }
            }
        }

    })
}

これは、Kotlinを練習するために取り組んでいるテストプロジェクトにすぎませんが、これは私が理解したいことです。

私がそれを完全に間違っている場合は私に知らせてください、どんなアドバイスも大歓迎です

ありがとう

6
aidan8181

Firebaseでオブジェクトを逆シリアル化するには、空のコンストラクタが必要です。

data class User(
        @Exclude val gUser: Boolean,
        @Exclude val uid: String,
        @PropertyName("display_name") val displayName: String,
        @PropertyName("email") val email: String,
        @PropertyName("account_picture_url") val accountPicUrl: String,
        @PropertyName("provider") val provider: String
) {
    constructor() : this(false, "", "", "", "", "")
}

そのように宣言して、プライマリコンストラクターを呼び出すことができるようにいくつかのデフォルト値を指定するか、すべてのパラメーターのデフォルト値を宣言することができます。

data class User (
        @Exclude val gUser: Boolean = false,
        @Exclude val uid: String = "",
        @PropertyName("display_name") val displayName: String = "",
        @PropertyName("email") val email: String = "",
        @PropertyName("account_picture_url") val accountPicUrl: String = "",
        @PropertyName("provider") val provider: String = ""
)

次に、空のコンストラクターを含む、さまざまなコンストラクターが作成されます。

シリアル化に問題がある場合は、ideによって生成されたゲッターとセッターが原因である可能性があります。@ getアノテーションと@setアノテーションでそれらを強化してみてください。

data class User (
        @Exclude val gUser: Boolean = false,
        @Exclude val uid: String = "",
        @set:PropertyName("display_name") 
        @get:PropertyName("display_name")
        var displayName: String = "",
        @PropertyName("email") val email: String = "",
        @set:PropertyName("account_picture_url")
        @get:PropertyName("account_picture_url")
        var accountPicUrl: String = "",
        @PropertyName("provider") val provider: String = ""
)
14
Levi Moreira