gpt4 book ai didi

database - Android Room Persistence 库和 Kotlin

转载 作者:IT老高 更新时间:2023-10-28 13:26:22 28 4
gpt4 key购买 nike

我正在尝试使用 Kotlin 和 Room Persistence Library 编写一个简单的应用程序.我关注了the tutorial在 Android 持久性代码实验室中。

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

但是当我尝试运行该应用程序时,它立即崩溃。这是崩溃日志:

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
房间版本: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 重命名参数,因此通过 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 - Android Room Persistence 库和 Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44065371/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com