Android Room Persistence library and Kotlin

前端 未结 6 608
迷失自我
迷失自我 2020-12-03 04:34

I am trying to write a simple app using Kotlin and Room Persistence Library. I followed the tutorial in the Android Persistence codelab.

Here is my AppDatabase<

相关标签:
6条回答
  • 2020-12-03 04:37

    Usually in project build.gradle I define the dependencies versions:

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

    so in app build.gradle the dependencies look like:

    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'
    }
    

    Now you can define Entities Daos and Database in Kotlin.

    Database:

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

    Entity:

    @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 renames params, so the SQL query to retrieve all the emails that belong at an user via the userId is:

    @Query("SELECT * FROM email "
                + "INNER JOIN user ON user.id = email.userId "
                + "WHERE user.id = :arg0")
        fun getEmailsForUser(userId: Int): List<Email>
    
    0 讨论(0)
  • 2020-12-03 04:42

    Try out these steps

    Step 1. Set the room_version in the project.gradle file

    buildscript {
        ext.kotlin_version = '1.1.51'
        ext.room_version = '1.0.0-alpha9-1'
    ...
    

    Step 2. Apply the kotlin-kapt plugin in the app.gradle file, and this solved my issue.

    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"
    ...
    

    Step 3. Add the kapt dependency in the app.gradle file

    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"
    ...
    }
    
    0 讨论(0)
  • 2020-12-03 04:46

    In my case, in build.gradle, when you have "annotationProcessor" you need to duplicate with "kapt" and it works.

    compile "android.arch.persistence.room:runtime:$room_version"
    annotationProcessor "android.arch.persistence.room:compiler:$room_version"
    kapt "android.arch.persistence.room:compiler:$room_version"
    
    0 讨论(0)
  • 2020-12-03 04:50

    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.

    0 讨论(0)
  • 2020-12-03 04:53

    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'

    0 讨论(0)
  • 2020-12-03 04:54

    Anyone interested in using Kotlin with Room and Data Binding can see this sample project https://github.com/entrpn/kotlin-room-databinding

    0 讨论(0)
提交回复
热议问题