Android Room Persistence 库和 Kotlin
Android Room Persistence library and Kotlin
我正在尝试使用 Kotlin 和 Room Persistence Library 编写一个简单的应用程序。
我在 Android 持久性代码实验室中关注 the tutorial。
这是我在 Kotlin 中的 AppDatabase
class:
@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)
看起来 class AppDatabase_Impl
不是自动生成的。我检查了从 codelab 下载的原始 java 应用程序,发现 AppDatabase_Impl
是自动生成的。
Kotlin 版本:1.1.2-3
房间版本:1.0.0-alpha1
有没有人有这方面的经验?
编辑:
使用 kapt
解决了我的问题。就我而言,我必须将 annotationProcessor
替换为 kapt
.
通常在项目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'
}
现在您可以在 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
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
注意:带参数查询。
Kotlin 重命名参数,因此 SQL 通过 userId 检索属于用户的所有电子邮件的查询是:
@Query("SELECT * FROM email "
+ "INNER JOIN user ON user.id = email.userId "
+ "WHERE user.id = :arg0")
fun getEmailsForUser(userId: Int): List<Email>
在我的例子中,在 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"
任何对将 Kotlin 与 Room 和 Data Binding 结合使用感兴趣的人都可以查看此示例项目https://github.com/entrpn/kotlin-room-databinding
试试这些步骤
步骤 1. 在 project.gradle
文件中设置 room_version
buildscript {
ext.kotlin_version = '1.1.51'
ext.room_version = '1.0.0-alpha9-1'
...
第 2 步。 在 app.gradle
文件中应用 kotlin-kapt
插件,这解决了我的问题。
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.在app.gradle
文件中添加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"
...
}
我差点放弃了。但在按照 dharmin007 所说的进行操作后,我还必须 清理 项目。这使它工作。我注意到无论何时将 kapt 添加到 gradle,都必须在同步 gradle 后清理项目。
我不知道我的回答是否有必要我知道上面的一些答案已经将这个包含在他们的答案中但是他们添加了其他东西
仅添加
apply plugin: 'kotlin-kapt'
我正在尝试使用 Kotlin 和 Room Persistence Library 编写一个简单的应用程序。 我在 Android 持久性代码实验室中关注 the tutorial。
这是我在 Kotlin 中的 AppDatabase
class:
@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)
看起来 class AppDatabase_Impl
不是自动生成的。我检查了从 codelab 下载的原始 java 应用程序,发现 AppDatabase_Impl
是自动生成的。
Kotlin 版本:1.1.2-3
房间版本:1.0.0-alpha1
有没有人有这方面的经验?
编辑:
使用 kapt
解决了我的问题。就我而言,我必须将 annotationProcessor
替换为 kapt
.
通常在项目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'
}
现在您可以在 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
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
注意:带参数查询。 Kotlin 重命名参数,因此 SQL 通过 userId 检索属于用户的所有电子邮件的查询是:
@Query("SELECT * FROM email "
+ "INNER JOIN user ON user.id = email.userId "
+ "WHERE user.id = :arg0")
fun getEmailsForUser(userId: Int): List<Email>
在我的例子中,在 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"
任何对将 Kotlin 与 Room 和 Data Binding 结合使用感兴趣的人都可以查看此示例项目https://github.com/entrpn/kotlin-room-databinding
试试这些步骤
步骤 1. 在 project.gradle
文件中设置 room_version
buildscript {
ext.kotlin_version = '1.1.51'
ext.room_version = '1.0.0-alpha9-1'
...
第 2 步。 在 app.gradle
文件中应用 kotlin-kapt
插件,这解决了我的问题。
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.在app.gradle
文件中添加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"
...
}
我差点放弃了。但在按照 dharmin007 所说的进行操作后,我还必须 清理 项目。这使它工作。我注意到无论何时将 kapt 添加到 gradle,都必须在同步 gradle 后清理项目。
我不知道我的回答是否有必要我知道上面的一些答案已经将这个包含在他们的答案中但是他们添加了其他东西
仅添加
apply plugin: 'kotlin-kapt'