58

Kotlin とRoom Persistence Libraryを使用して簡単なアプリを作成しようとしています。Android Persistence Codelabのチュートリアルに従いました。

AppDatabaseKotlinでの私のクラスは次のとおりです。

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

クラスAppDatabase_Implが自動生成されていないようです。Codelab からダウンロードした元の Java アプリを確認したところ、自動生成されていることがわかりましたAppDatabase_Impl

Kotlin バージョン: 1.1.2-3
Room バージョン:1.0.0-alpha1

これを経験した人はいますか?

編集: 使用kaptすると問題が解決します。私の場合、 に置き換える必要annotationProcessorがありkaptます。

4

6 に答える 6

12

これらの手順を試してください

ステップ 1.ファイルに を設定room_versionするproject.gradle

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

ステップ 2.ファイルにkotlin-kaptプラグインを適用すると、問題が解決しました。app.gradle

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依存関係を追加するapp.gradle

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"
...
}
于 2017-09-30T20:15:52.923 に答える
4

Room および Data Binding で Kotlin を使用することに関心のある方は、このサンプル プロジェクトhttps://github.com/entrpn/kotlin-room-databindingを参照してください。

于 2017-08-14T18:01:19.870 に答える