android room史上最快速入门教程(kotlin版本)

本文详细介绍了Android中的Room ORM库,它简化了SQLite数据库的使用。文章通过实例展示了如何导入依赖、创建Entity、定义Dao以及设置数据库,并在Activity中使用协程进行数据操作。同时,提到了在开发过程中可能遇到的常见问题及解决方案,如依赖下载失败和Entity构造方法缺失等。
摘要由CSDN通过智能技术生成

一、Room介绍

Android采用Sqlite作为数据库存储。Sqlite代码写起来繁琐且容易出错,所以开源社区里逐渐出现了各种ORM(Object Relational Mapping)库。这些开源ORM库都是为了方便Sqlite的使用,包括数据库的创建,升级,增删改查等。常见的ORM有ORMLite,GreenDAO等。Google也意识到了推出自家ORM的必要性,于是有了Room。

二、Room的使用

  • 导入依赖
def room_version = "2.4.2"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
  • 新建一个Entity
package com.example.jetpacktest

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

@Entity(tableName = "Word") //对应的是数据库中的表名称
class Word() {

    //主键,自增
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0

    //不使用ColumnInfo,则使用字段名。这里name的值就是数据表的字段名。
    @ColumnInfo(name = "english_word")
    var word: String = ""

    @ColumnInfo(name = "chinese_meaning")
    var chineseMeaning: String = ""

    override fun toString(): String {
        return "Word(id=$id, word='$word', chineseMeaning='$chineseMeaning')"
    }

    constructor(_word: String, _chineseMeaning: String) : this() {
        word = _word
        chineseMeaning = _chineseMeaning
    }
}
  • 操作数据表的接口Dao
package com.example.jetpacktest

import androidx.room.*

@Dao
interface WordDao {
    @Insert
    fun insertWords(vararg item: Word)

    @Update
    fun updateWords(vararg item: Word)

    @Delete
    fun deleteWords(vararg item: Word)

    @Query("DELETE FROM Word")
    fun deleteAllWords()

    @Query("SELECT * FROM Word ORDER BY id DESC")
    fun getAllWords(): List<Word>

}
  • 数据库名称,版本号等
package com.example.jetpacktest

import androidx.room.Database
import androidx.room.RoomDatabase

//entities: 实例类 version: 数据库版本号 exportSchema: 是否需要导出 Schema
@Database(entities = [Word::class], version = 1, exportSchema = false)
abstract class WordDataBase : RoomDatabase() {

    abstract fun getWordDao(): WordDao

}
  • 在Activity中使用
    • Android-Room要求数据操作不能在UI线程中,需要在子线程中进行操作,因此使用kotlin的协程方式进行调用:
    • 使用协程首先添加依赖:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2'
package com.example.jetpacktest

import android.os.Bundle
import android.view.View
import androidx.annotation.RestrictTo
import androidx.appcompat.app.AppCompatActivity
import androidx.room.Room
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {

    private var mWordDao: WordDao? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        CoroutineScope(Dispatchers.IO).launch {
            //这里的name表示 DataBase 名字
            val mWordDataBase: WordDataBase =
                Room.databaseBuilder(this@MainActivity, WordDataBase::class.java, "111").build()

            mWordDao = mWordDataBase.getWordDao()
        }

    }

    fun addData(view: View) {
        //注意得开启一个协成使用,因为这是耗时操作,不能在主线程(UI线程做)
        CoroutineScope(Dispatchers.IO).launch {
            val word1 = Word("Hello", "你好")
            val word2 = Word("World", "世界")
            mWordDao?.insertWords(word1, word2)
            println(mWordDao?.getAllWords())
        }
    }

    fun updateData(view: View) {
        CoroutineScope(Dispatchers.IO).launch {
            val word = Word("hai", "你好啊")
            word.id = 2
            //如果id为2的数据不存在,则这条语句无反应
            mWordDao?.updateWords(word)
            println(mWordDao?.getAllWords())
        }
    }

    fun deleteData(view: View) {
        CoroutineScope(Dispatchers.IO).launch {
            val word = Word("hai", "你好啊")
            word.id = 2
            //如果id为2的数据不存在,则这条语句无反应
            mWordDao?.deleteWords(word)
            println(mWordDao?.getAllWords())
        }
    }

    fun clearData(view: View) {
        CoroutineScope(Dispatchers.IO).launch {
            mWordDao?.deleteAllWords()
            println(mWordDao?.getAllWords())
        }
    }
}

三、效果展示

四、常见问题 

  • gradle导入依赖问题,半天依赖下载失败

maven{ url 'https://maven.aliyun.com/repository/central'} 
maven{ url 'https://maven.aliyun.com/repository/public' } 
maven{ url 'https://maven.aliyun.com/repository/google' } 
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin' } 
maven{ url 'https://maven.aliyun.com/repository/spring' } 
maven{ url 'https://maven.aliyun.com/repository/spring-plugin' } 
maven{ url 'https://maven.aliyun.com/repository/grails-core' } 
maven{ url 'https://maven.aliyun.com/repository/apache-snapshots' }
  • Caused by: java.lang.RuntimeException: cannot find implementation for com.examplexxx.xxxDataBase. xxxDataBase_Impl does not exist 

       这个问题是注解处理器导入的问题

       解决办法如下

  • Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).

        这个问题是 Entity 没有编写无参构造方法的问题

        解决方法如下:

        给 Entity 添加一个无参构造方法即可

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super码王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值