使用Room和kotlin,在建立数据库时获取异常 [英] using Room with kotlin, get exception when build the database

查看:491
本文介绍了使用Room和kotlin,在建立数据库时获取异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新:尝试了Mike的建议,但仍然收到错误消息:

UPDATE: tried Mike's suggestion, still get error:

ext {
kotlin_version = '1.1.50'
arch_lib_version = '1.0.0-alpha9'
gradle_version = '2.3.3'
}

kapt {
    generateStubs = true
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')

compile "android.arch.lifecycle:runtime:$arch_lib_version"
compile "android.arch.lifecycle:extensions:$arch_lib_version"
compile "android.arch.persistence.room:runtime:$arch_lib_version"

//annotationProcessor "android.arch.persistence.room:compiler:$arch_lib_version"
kapt "android.arch.persistence.room:compiler:$arch_lib_version"
annotationProcessor "android.arch.lifecycle:compiler:$arch_lib_version"
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"



Error:Annotation processor '__gen.AnnotationProcessorWrapper_robotiumDebug_android_arch_persistence_room_RoomProcessor' not found

============

============

在gradle中:

ext {
    arch_lib_version = '1.0.0-alpha9'
}

compile "android.arch.persistence.room:runtime:$arch_lib_version"

annotationProcessor "android.arch.persistence.room:compiler:$arch_lib_version"
//kapt "android.arch.persistence.room:compiler:$arch_lib_version"

使用kapt进行尝试,它将产生编译错误:

tried using the kapt, it will give compile error:

Error:Annotation processor '__gen.AnnotationProcessorWrapper_robotiumDebug_android_arch_persistence_room_RoomProcessor' not found

下面的代码段:

      @Database(entities = arrayOf(CModel::class), version = 1)
abstract  class CDatabase  : RoomDatabase() {

abstract fun cModel(): DbCDao

companion object {
    fun getDatabase(context: Context): CDatabase {
        return Room.databaseBuilder(context.applicationContext, CDatabase::class.java, "database")
.build()  //<=== throw here saying CDatabase_Impl does not exist
    }    
}

}

桌子分类:

@Entity(tableName = "table")
class CModel() : ICDelegate {

@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "index")
private var mIndex: Long = -1

@ColumnInfo(name = "parentIndex")
private var mParentIndex: Long = -1

……
}

Dao界面定义:

@Dao
interface DbCDao {

@Query("select * from table")
fun loadAllAccountss(): List<CModel>

@Query("select * from table where index = :index")
fun loadCsByIndex(index: Int): CModel

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertC(ac: CModel) : Long

@Update(onConflict = OnConflictStrategy.REPLACE)
fun updateAC(ac: CModel) : Int

@Delete
fun deleteAc(ac: CModel) : Int

@Query("DELETE FROM table")
fun deleteAllCs()


}

例外:

   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
                                        Caused by: 
java.lang.RuntimeException: cannot find implementation for com.myproject.data. CDatabase. CDatabase_Impl does not exist
                                           at 
android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:90)
                                           at 

android.arch.persistence.room.RoomDatabase $ Builder.build(RoomDatabase.java:440)

android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:440)

尝试有人建议但不起作用:

tried someone suggested and does not work:

javaCompileOptions {
        annotationProcessorOptions {
            arguments = ["room.schemaLocation":
            "$projectDir/schemas".toString()]
        }
    }

推荐答案

这是我可行的build.gradle文件:

This is my workable build.gradle file:

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

...    
kapt {
    generateStubs = true
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'commons-io:commons-io:2.5'
    compile "android.arch.persistence.room:runtime:1.0.0-alpha9-1"
    kapt "android.arch.persistence.room:compiler:1.0.0-alpha9-1"
}

考虑:

  • 应用插件:"kapt" .
  • kapt { generateStubs = true }
  • 在实现时进行编译.
  • apply plugin: 'kapt' is removed.
  • kapt { generateStubs = true }
  • compile instead on implementation.

我使用Kotlin 1.1.50.

I used Kotlin 1.1.50.

这篇关于使用Room和kotlin,在建立数据库时获取异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆