![]() |
Android Room Persistence library and Kotlin - Printable Version +- 0Day Forums (https://0day.red) +-- Forum: Coding (https://0day.red/Forum-Coding) +--- Forum: Database (https://0day.red/Forum-Database) +--- Thread: Android Room Persistence library and Kotlin (/Thread-Android-Room-Persistence-library-and-Kotlin) |
Android Room Persistence library and Kotlin - ainslieseul - 07-20-2023 I am trying to write a simple app using Kotlin and [Room Persistence Library][1]. I followed [the tutorial][2] in the Android Persistence codelab. Here is my `AppDatabase` class in 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 } } } But when I tried to run the app, it crashes immediately. Here is the crash log: 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) It looks like the class `AppDatabase_Impl` wasn't autogenerated. I checked the original java app downloaded from codelab and found that `AppDatabase_Impl` was autogenerated. Kotlin version: `1.1.2-3` Room version: `1.0.0-alpha1` Is there anyone experienced with this? **Edit:** Using `kapt` solves my problem. In my case, I have to replace `annotationProcessor` with `kapt`. [1]: [To see links please register here] [2]:[To see links please register here] RE: Android Room Persistence library and Kotlin - delatorre724 - 07-20-2023 Anyone interested in using Kotlin with Room and Data Binding can see this sample project [To see links please register here] RE: Android Room Persistence library and Kotlin - sinupallia181163 - 07-20-2023 Try out these steps **Step 1.** Set the `room_version` in the `project.gradle` file buildscript { ext.kotlin_version = '1.1.51' ext.room_version = '1.0.0-alpha9-1' ... **Step 2.** Apply the `kotlin-kapt` plugin in the `app.gradle` file, and this solved my issue. apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { compileSdkVersion 26 buildToolsVersion "26.0.1" ... **Step 3.** Add the `kapt` dependency in the `app.gradle` file dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "android.arch.persistence.room:runtime:$room_version" annotationProcessor "android.arch.persistence.room:compiler:$room_version" kapt "android.arch.persistence.room:compiler:$room_version" ... } RE: Android Room Persistence library and Kotlin - roseanneatxggblx - 07-20-2023 i almost gave up. but after doing just what dharmin007 said i also had to **clean** the project. that made it work. I've noticed that whenever you add kapt to gradle you MUST clean the project after synching gradle. RE: Android Room Persistence library and Kotlin - tiv754 - 07-20-2023 In my case, in build.gradle, when you have "annotationProcessor" you need to duplicate with "kapt" and it works. compile "android.arch.persistence.room:runtime:$room_version" annotationProcessor "android.arch.persistence.room:compiler:$room_version" kapt "android.arch.persistence.room:compiler:$room_version" RE: Android Room Persistence library and Kotlin - trigamist905552 - 07-20-2023 I don't know if there is a necessity to my answer I know that some of the above answers already included this to their answers but they added other things ONLY ADD `apply plugin: 'kotlin-kapt'` RE: Android Room Persistence library and Kotlin - katharinetzfdubfq - 07-20-2023 Usually in project `build.gradle` I define the dependencies versions: ext { buildToolsVersion = '25.0.2' supportLibVersion = '25.3.1' espressoVersion = '2.2.2' archRoomVersion = '1.0.0-alpha1' } so in app `build.gradle` the dependencies look like: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" compile "com.android.support:appcompat-v7:${rootProject.supportLibVersion}" compile "android.arch.persistence.room:runtime:${rootProject.archRoomVersion}" annotationProcessor "android.arch.persistence.room:compiler:${rootProject.archRoomVersion}" kapt "android.arch.persistence.room:compiler:${rootProject.archRoomVersion}" androidTestCompile("com.android.support.test.espresso:espresso-core:${rootProject.espressoVersion}", { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' } Now you can define Entities Daos and Database in Kotlin. Database: @Database(entities = arrayOf(User::class), version = 1) abstract class Database : RoomDatabase() { abstract fun userDao(): UserDao } Entity: @Entity(tableName = "user") class User { @PrimaryKey(autoGenerate = true) var id: Int = 0 var name: String = "" } Dao: @Dao interface UserDao { @Query("SELECT * FROM user") fun getAll(): List<User> @Insert fun insertAll(vararg users: User) @Delete fun delete(user: User) } **NB: Query with parameters.** Kotlin renames params, so the SQL query to retrieve all the emails that belong at a user via the userId is: @Query("SELECT * FROM email " + "INNER JOIN user ON user.id = email.userId " + "WHERE user.id = :arg0") fun getEmailsForUser(userId: Int): List<Email> |