我正试着用Kotlin和Room Persistence Library写一个简单的应用程序. 我在Android Persistence codelab中关注了the tutorial.

这是我在Kotlin 的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
        }
    }
}

但当我试图运行这个应用程序时,它立即崩溃了. 以下是崩溃日志(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)

看起来AppDatabase_Impl类不是自动生成的.我判断了从codelab下载的原始java应用程序,发现有AppDatabase_Impl个是自动生成的.

Kotlin version: 1.1.2-3
Room version: 1.0.0-alpha1

有谁有这方面的经验吗?

Edit:kapt可以解决我的问题.在我的情况下,我必须用kapt代替annotationProcessor.

推荐答案

通常在项目build.gradle中,我定义依赖项版本:

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

因此,在APP 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'
}

现在您可以用Kotlin定义实体DAOS和数据库了.

数据库:

@Database(entities = arrayOf(User::class), version = 1)
abstract class Database : RoomDatabase() {
    abstract fun userDao(): UserDao
}

实体:

@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重命名params,因此通过userid检索属于某个用户的所有邮箱的SQL查询为:

@Query("SELECT * FROM email "
            + "INNER JOIN user ON user.id = email.userId "
            + "WHERE user.id = :arg0")
    fun getEmailsForUser(userId: Int): List<Email>

Database相关问答推荐

如何将使用模块创建的 Redis RDB 文件迁移到没有该模块的部署? (RedisStack 版本 7.2+ 中不再包含 RedisGraph)

如何将表字段的默认值设置为 0.00?

MYSQL CASE 语句多条件

如何在 sql server 2005 中获取到数据库的详细连接列表?

MySQL 慢查询日志(log) - 慢有多慢?

将 .frm 和 .opt 文件导入 MySQL

带有字符串列的 SQL 之间的子句

如何在 MS Access 中实现 SQL INTERSECT 和 MINUS 操作

用于 sql server 的免费国家、城市数据库

FOR UPDATE和JOIN的 SQL 语义

postgresql 在 where 子句中使用 json 子元素

Boxed与原始类型作为实体 id

SQLite3 不支持外键约束吗?

多语言数据库,默认回退

有没有一种简单的方法来告诉 alembic 迁移到特定版本?

如何使用 Realm 进行排序?

如何在 SQL Server 中总结时间字段

如何在 SQL Server 中生成并手动插入唯一标识符?

如何将纬度/经度对转换为 PostGIS 地理类型?

不同类型的SQL之间的区别?