Android Room Persistences 라이브러리 및 Kotlin
Kotlin 및 Room Persistance Library를 사용하여 간단한 앱을 작성하려고합니다 . 나는 다음 튜토리얼 안드로이드 지속성 코드 랩에 있습니다.
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 클래스가 자동 생성되지 않은 것 같습니다. 코드 랩에서 다운로드 한 원본 자바 앱을 확인한 결과 AppDatabase_Impl이 자동 생성되었음을 확인했습니다.
Kotlin 버전 : 1.1.2-3 Room 버전 : 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 :
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
NB : 매개 변수로 쿼리합니다. 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>
제 경우에는 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"
이 단계를 시도하십시오
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
문제가 해결되었습니다.
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"
...
}
Anyone interested in using Kotlin with Room and Data Binding can see this sample project https://github.com/entrpn/kotlin-room-databinding
i almost gave up. but after doing just what dharmin007 said i also had to clean the project. that made it work. I've noticed that whenever you add kapt to gradle you MUST clean the project after synching gradle.
I don't know if there is a necessity to my answer I know that some of the above answers already included this to their answers but they added other things
ONLY ADD apply plugin: 'kotlin-kapt'
ReferenceURL : https://stackoverflow.com/questions/44065371/android-room-persistences-library-and-kotlin
'programing' 카테고리의 다른 글
`.queryset` 속성이 없거나`.get_queryset ()`메서드를 재정의하는 뷰에는 DjangoModelPermissions를 적용 할 수 없습니다. (0) | 2021.01.19 |
---|---|
Flask에서 request.args는 무엇이며 어떻게 사용됩니까? (0) | 2021.01.19 |
쿠키 JSESSIONID 이름 변경 (0) | 2021.01.19 |
콘솔에 출력 형식을 지정하고 탭 수를 지정합니다. (0) | 2021.01.19 |
인덱스를 포함하는 MySQL 테이블 복사 (0) | 2021.01.19 |