0Day Forums
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>