10 votes

Room Persistence @Relation fonctionne en Java mais pas en Kolin

Sur la base de ma question précédente ( Salle de persistance Android : "Impossible de savoir comment lire ce champ à partir d'un curseur" ) que j'ai réussi à faire fonctionner grâce aux commentaires, j'ai implémenté le même exemple dans Kolin (voir le code ci-dessous). J'ai dû faire quelques changements mineurs comme les paramètres qui sont maintenant passés à la requête qui doivent être passés comme "p0", "p1" etc. Maintenant, en Kotlin, j'obtiens l'erreur suivante concernant la classe UserWithPets :

erreur : Impossible de savoir comment lire ce champ à partir d'un curseur. e : private java.util.List pets ;

@Dao
interface UserDAO {   

    @get:Query("SELECT * FROM user")
    val all: LiveData<List<User>>

    @Insert
    fun insertUser(user: User) //single one

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertUsers(vararg users: User)

    @Query("SELECT * FROM User")
    fun loadUsersWithPets(): LiveData<List<UserWithPets>>

}

@Entity
class Pet( var name: String?,  var ownerId: Int,@PrimaryKey(autoGenerate = true)var id:Int)

@Dao
interface PetDAO {
    @Query("SELECT * FROM pet")
    val all: List<Pet>

    @Query("SELECT * FROM pet WHERE id IN (:p0)")
    fun loadAllByIds(petIds: IntArray): List<Pet>

    @Insert
    fun insert(pet: Pet)

    @Insert
    fun insertAll(vararg pets: Pet)

    @Delete
    fun delete(user: Pet)
}

class UserWithPets {
    @Embedded
    var user: User? = null

    @Relation(parentColumn = "id", entityColumn = "ownerId", entity = Pet::class)
    var pets: List<Pet>? = null
}

Il semble que si j'écris le UserWithPets en Java fonctionnera correctement, mais échouera si elle est écrite en Kotlin. Une idée de ce qui ne va pas ? S'agit-il d'un problème de traitement des annotations ?

0voto

straider Points 23

Essayez de mettre à jour la salle vers la version 1.0.0-alpha8 et ajoutez List<@JvmSuppressWildcards Pet>.

0voto

Aniket Bhoite Points 11

Essayez de modifier votre requête @Query("SELECT * FROM pet WHERE id IN (:p0)")

t @Query("SELECT * FROM pet WHERE id IN (:petIds)")

Il y avait un problème entre kotlin et Room lib, Kotlin ne préservait pas correctement les noms des paramètres des arguments, donc (:p0)/(:arg0) était un moyen de contourner ce problème, c'est maintenant résolu.

J'espère que cela résoudra le problème

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X