database - جافا - مكتبة Android Room Persistences و Kotlin



بين الفرق (4)

أحاول كتابة تطبيق بسيط باستخدام Kotlin و Room Persistance Library . تابعت البرنامج التعليمي في codelab Android Persistance.

فيما يلي AppDatabase في 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
        }
    }
}

ولكن عندما حاولت تشغيل التطبيق ، فإنه يتعطل على الفور. هنا سجل الأعطال:

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 لم يتم تكوينها تلقائيًا. لقد راجعت تطبيق java الأصلي الذي تم تنزيله من codelab ووجدت أن AppDatabase_Impl تم إنشاؤه تلقائيًا.

إصدار Kotlin: 1.1.2-3 إصدار الغرفة: 1.0.0-alpha1

هل هناك أي شخص من ذوي الخبرة مع هذا؟

تحرير: استخدام kapt يحل مشكلتي. في حالتي ، لا بد لي من استبدال annotationProcessor بـ kapt.


Answer #1

أنا تقريبا استسلم. ولكن بعد القيام بما قاله dharmin007 كان علي أيضًا تنظيف المشروع. التي جعلت من العمل. لقد لاحظت أنه كلما قمت بإضافة kapt إلى gradle يجب تنظيف المشروع بعد مزامنة gradle.


Answer #2

جرب هذه الخطوات

الخطوة 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 ، وهذا حل 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"
...
}

Answer #3

في حالتي ، في 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"

Answer #4

لا أعرف إذا كانت هناك ضرورة لإجابتي وأنا أعلم أن بعض الإجابات المذكورة أعلاه تضمنت هذا بالفعل لإجاباتهم لكنها أضافت أشياء أخرى

فقط أضف apply plugin: 'kotlin-kapt'





android-room