Kotlin+Room入门学习数据存储

本来是名iOS开发者由于对安卓好奇,一步一步来学习
什么也不说了先上代码吧.

第一步 添加依赖build.gradle

dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
allprojects {
    repositories {
        maven {
            url 'https://maven.google.com'
        }
        google()
        jcenter()
        
    }
}

第二 找到build.gradle(Module.app)

apply plugin: 'kotlin-kapt'
//使用生成文件
kapt {
    generateStubs = true
}
android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.example.apidebug"
        minSdkVersion 26
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
 def room_version = "1.1.1"
//    添加json转换第三方
    implementation "com.google.code.gson:gson:2.8.5"


    implementation "android.arch.persistence.room:runtime:$room_version"
    annotationProcessor "android.arch.persistence.room:compiler:$room_version"
    kapt "android.arch.persistence.room:compiler:$room_version"
    // optional - RxJava support for Room
    implementation "android.arch.persistence.room:rxjava2:$room_version"
    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "android.arch.persistence.room:guava:$room_version"


    // Test helpers
    testImplementation "android.arch.persistence.room:testing:$room_version"
    //robolectric测试
    testImplementation 'org.robolectric:shadows-multidex:3.8'
    testImplementation "org.robolectric:robolectric:3.8"

    //更改为
    implementation 'com.android.support.test:runner:1.0.2'

第三步 创建一个数据模型 User为例

package com.example.apidebug

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity
class User {
    @PrimaryKey
    var uid:Int? = null
    @ColumnInfo(name = "first_name")
    var firstName:String? = null
    @ColumnInfo(name = "last_name")
    var lastName:String? = null


}

第四步 UserDao

package com.example.apidebug

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query

@Dao
public interface  UserDao:BaseDao{
    @Query("SELECT * FROM User")
    fun getAll(): List
    @Query("SELECT * FROM User WHERE uid IN (:userIds)")
    fun loadAlllByIds(userIds:List ):List

}

第五步 其实还是要写个父类BaseDao 把公用的写到父类里

package com.example.apidebug

import androidx.room.*

@Dao
interface BaseDao{
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(list: MutableList)

    @Delete
    fun delete(element: T)

    @Delete
    fun deleteList(elements:MutableList)

    @Delete
    fun deleteSome(vararg elements:T)

    @Update
    fun update(element: T)
}

第六步写一个全局的Application 单利MyApplication


别网络写好之后在AndroidManifest.xml 的 android:name=".MyApplication"

package com.example.apidebug

import android.app.Application
import kotlin.properties.Delegates

class MyApplication :Application(){
    companion object {

        private var instance:MyApplication by Delegates.notNull()

        fun instance() = instance!!
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
    }
}

第七步 写一个集成RoomDatabase的单利子类 AppDatabase

package com.example.apidebug

import androidx.room.Database
import androidx.room.RoomDatabase
import android.icu.lang.UCharacter.GraphemeClusterBreak.V
import androidx.room.Room


@Database(entities = arrayOf(User::class), version = 1)
public  abstract  class  AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
    companion object{

            val instance = Single.sin

    }


    private object Single {

        val sin :AppDatabase = Room.databaseBuilder(
                MyApplication.instance(),
                AppDatabase::class.java,
                "User1"
            )
                .allowMainThreadQueries()
                .build()
    }
}

第八步 自我检测了

package com.example.apidebug

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.google.gson.Gson

class MainActivity : AppCompatActivity() {
    var sDao: UserDao = AppDatabase.instance.userDao()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var lista = sDao.getAll()

        println("lista ${Gson().toJson(lista)}")

        var sList:MutableList = mutableListOf()
        var model = User()
        model.firstName = "小明"
        model.lastName = "黑"
        sList.add(model)

        sDao.insertAll(sList)



//        this.navigate
    }
}


文章到此结束了,自己在学的时候遇到的坑,期望其他的小伙伴可以绕过这个坑喜欢的话点个赞,以后有更多分享内容

你可能感兴趣的:(Kotlin+Room入门学习数据存储)