Bibliothèque Android Persistences et Kotlin

J’essaie d’écrire une application simple en utilisant Kotlin et Room Persistance Library . J’ai suivi le tutoriel dans le codelab Android Persistance.

Voici ma classe AppDatabase dans Kotlin:

 @Database(entities = arrayOf(User::class), version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userModel(): UserDao companion object { private var INSTANCE: AppDatabase? = null @JvmStatic fun getInMemoryDatabase(context: Context): AppDatabase { if (INSTANCE == null) { INSTANCE = Room.inMemoryDatabaseBuilder(context.applicationContext, AppDatabase::class.java).allowMainThreadQueries().build() } return INSTANCE!! } @JvmStatic fun destroyInstance() { INSTANCE = null } } } 

Mais lorsque j’ai essayé d’exécuter l’application, il se bloque immédiatement. Voici le journal des incidents:

 Caused by: java.lang.RuntimeException: cannot find implementation for com.ttp.kotlin.kotlinsample.room.AppDatabase. AppDatabase_Impl does not exist at android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:90) at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:340) at com.ttp.kotlin.kotlinsample.room.AppDatabase$Companion.getInMemoryDatabase(AppDatabase.kt:19) at com.ttp.kotlin.kotlinsample.MainKotlinActivity.onCreate(MainKotlinActivity.kt:28) at android.app.Activity.performCreate(Activity.java:6272) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494) at android.app.ActivityThread.access$900(ActivityThread.java:157) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356) 

Il semble que la classe AppDatabase_Impl n’ait pas été générée automatiquement. J’ai vérifié l’application d’origine Java téléchargée à partir du codelab et constaté que AppDatabase_Impl était généré automatiquement.

Version Kotlin: 1.1.2-3 Version de la salle: 1.0.0-alpha1

Y a-t-il quelqu’un expérimenté avec cela?

Edit: Utiliser kapt résout mon problème. Dans mon cas, je dois remplacer annotationProcessor par kapt.

Habituellement, dans le projet build.gradle je définis les versions des dépendances:

 ext { buildToolsVersion = '25.0.2' supportLibVersion = '25.3.1' espressoVersion = '2.2.2' archRoomVersion = '1.0.0-alpha1' } 

donc dans app build.gradle les dépendances ressemblent à:

 dependencies { comstack fileTree(dir: 'libs', include: ['*.jar']) comstack "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" comstack "com.android.support:appcompat-v7:${rootProject.supportLibVersion}" comstack "android.arch.persistence.room:runtime:${rootProject.archRoomVersion}" annotationProcessor "android.arch.persistence.room:comstackr:${rootProject.archRoomVersion}" kapt "android.arch.persistence.room:comstackr:${rootProject.archRoomVersion}" androidTestComstack("com.android.support.test.espresso:espresso-core:${rootProject.espressoVersion}", { exclude group: 'com.android.support', module: 'support-annotations' }) testComstack 'junit:junit:4.12' } 

Vous pouvez maintenant définir les entités Daos et la firebase database dans Kotlin.

Base de données:

 @Database(entities = arrayOf(User::class), version = 1) abstract class Database : RoomDatabase() { abstract fun userDao(): UserDao } 

Entité:

 @Entity(tableName = "user") class User { @PrimaryKey(autoGenerate = true) var id: Int = 0 var name: Ssortingng = "" } 

Dao:

 @Dao interface UserDao { @Query("SELECT * FROM user") fun getAll(): List @Insert fun insertAll(vararg users: User) @Delete fun delete(user: User) } 

NB: Interrogez avec des parameters. Kotlin renomme les parameters, donc la requête SQL pour récupérer tous les emails appartenant à un utilisateur via le userId est la suivante:

 @Query("SELECT * FROM email " + "INNER JOIN user ON user.id = email.userId " + "WHERE user.id = :arg0") fun getEmailsForUser(userId: Int): List 

Dans mon cas, dans build.gradle, lorsque vous avez “annotationProcessor”, vous devez dupliquer avec “kapt” et cela fonctionne.

 comstack "android.arch.persistence.room:runtime:$room_version" annotationProcessor "android.arch.persistence.room:comstackr:$room_version" kapt "android.arch.persistence.room:comstackr:$room_version" 

Essayez ces étapes

Étape 1. Définissez la room_version dans le fichier project.gradle

 buildscript { ext.kotlin_version = '1.1.51' ext.room_version = '1.0.0-alpha9-1' ... 

Étape 2. Appliquez le kotlin-kapt in kotlin-kapt dans le fichier app.gradle , ce qui résout mon problème.

 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { comstackSdkVersion 26 buildToolsVersion "26.0.1" ... 

Étape 3. Ajoutez la dépendance kapt dans le fichier app.gradle

 dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "android.arch.persistence.room:runtime:$room_version" annotationProcessor "android.arch.persistence.room:comstackr:$room_version" kapt "android.arch.persistence.room:comstackr:$room_version" ... } 

Toute personne intéressée par l’utilisation de Kotlin avec Room and Data Binding peut voir cet exemple de projet https://github.com/entrpn/kotlin-room-databinding

J’ai presque abandonné. mais après avoir fait exactement ce que dharmin007 a dit, je devais aussi nettoyer le projet. ça a fonctionné. J’ai remarqué que chaque fois que vous ajoutez kapt pour graduer, vous DEVEZ nettoyer le projet après la synchronisation.