Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 260 Vote(s) - 3.3 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Android Room Persistence library and Kotlin

#1
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]

Reply

#2
Anyone interested in using Kotlin with Room and Data Binding can see this sample project

[To see links please register here]

Reply

#3
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"
...
}
Reply

#4
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.
Reply

#5
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"
Reply

#6
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'`
Reply

#7
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>
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through