Android Room Persistences library и Kotlin

Я пытаюсь написать простое приложение, используя Kotlin и Библиотека Настойчивости Комнаты. Я следовал учебник в Android Persistance codelab.

вот мой AppDatabase класс в Котлине:

@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
        }
    }
}

но когда я попытался запустить приложение, оно вылетает сразу. Вот журнал сбоев:

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.access0(ActivityThread.java:157) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356)

похоже, класс AppDatabase_Impl не автогенерируемые. Я проверил исходное приложение java, загруженное из codelab, и нашел что AppDatabase_Impl были созданы автоматически.

Котлин версия: 1.1.2-3 Версия номера: 1.0.0-alpha1

есть ли кто-нибудь, кто испытал это?

Edit: Использование kapt решает мою проблему. В моем случае я должен заменить annotationProcessor на kapt.

5 ответов


обычно в проекте build.gradle Я определяю версии зависимостей:

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

так, в приложении build.gradle зависимости выглядят так:

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'
}

теперь вы можете определить объекты Daos и базы данных в Котлине.


в моем случае, в build.gradle, когда у вас есть" annotationProcessor", вам нужно дублировать с" kapt", и он работает.

compile "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
kapt "android.arch.persistence.room:compiler:$room_version"

попробуйте эти шаги

Шаг 1. установить room_version на

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

Шаг 2. применить kotlin-kapt plugin в , и это решило мою проблему.

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"
...

Шаг 3. добавить kapt зависимостей в

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"
...
}

любой, кто заинтересован в использовании Kotlin с привязкой комнаты и данных, может увидеть этот пример проекта https://github.com/entrpn/kotlin-room-databinding


Я почти сдался. но после того, как я сделал то, что сказал dharmin007, мне также пришлось очистить проект. это сработало. Я заметил, что всякий раз, когда вы добавляете kapt в gradle, вы должны очистить проект после синхронизации gradle.