Jetpack系列 Room



提示:以下是本篇文章正文内容,下面案例可供参考

一、Room是什么?

Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。

二、使用步骤

1.引入库

代码如下(示例):


  def room_version = "2.3.0"
	//必须项
  implementation "androidx.room:room-runtime:$room_version"
  kapt "androidx.room:room-compiler:$room_version"

  // 可选项- kotlin扩展
  implementation "androidx.room:room-ktx:$room_version"

  // optional - 测试
  testImplementation "androidx.room:room-testing:$room_version"

2.创建实体类

代码如下(示例):

Emp.kt

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

@Entity         //声明当前类作为Room表示数据库中的表。
data class Emp(
    @PrimaryKey(autoGenerate = true)    //主键、自动增长
     val id:Int ? = null,

    @ColumnInfo(name = "english_word")      //别名
     val word:String? ,

    @ColumnInfo(name = "chinese_meaning")
     val chineseMeaning: String?
)

3.创建Dao层

WordDao.kt

import androidx.room.*
import com.example.roombasic.emp.Emp

@Dao        //用于访问数据库的方法。
interface WordDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)   //如果有冲突就直接代替
    fun insertWords( emp: Emp):Long

    @Update
    fun updateWords(emp: Emp):Int

    @Delete
    fun deleteWords(emp: Emp):Int

    @Query("SELECT * FROM EMP ORDER BY ID DESC")
    fun getAllWords():MutableList<Emp>

    @Query("DELETE FROM EMP")
    fun clearAll():Int
}

4.创建DataBase层

WordDataBases.kt

@Database(entities = [Emp::class],version = 1,exportSchema = false) //与数据库关联的实体列表
abstract class WordDataBases : RoomDatabase() {  //扩展 RoomDatabase 的抽象类
    abstract fun  getWordDao():WordDao  //返回使用 @Dao 注释的类的抽象方法
}

5.操作数据库

MainActivity.kt


import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.room.Room
import com.example.roombasic.dao.WordDataBases
import com.example.roombasic.emp.Emp
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext


/*
* 在数据库中 删除某一行数据  id是不会重新排序的   比如删除了id=10  那么就没有10了
*
* */
class MainActivity : AppCompatActivity() {

    //通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 的实例
    private val wordDatabase by lazy {
        Room.databaseBuilder(
            this,
            WordDataBases::class.java,
            "word_database.db"
        )
//            .allowMainThreadQueries()          //强制在主线程执行    不建议 因为会导致主线程卡顿
            .build()
    }

    private val wordDao by lazy { wordDatabase.getWordDao() }

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

        initData()        //初始化数据

        bt_insert.setOnClickListener {
            insertView()       //插入数据
            initData()       //更新数据
        }
        bt_update.setOnClickListener {
            updateView()
            initData()
        }
        bt_delete.setOnClickListener {
            deleteView()
            initData()
        }
        bt_clear.setOnClickListener {
            clearView()
            initData()
        }


    }

    private fun clearView() {
        lifecycleScope.launchWhenCreated {
            withContext(Dispatchers.Default){
                wordDao.clearAll()
            }
        }



    }

    private fun deleteView() {
        lifecycleScope.launch {
            withContext(Dispatchers.Default){
                wordDao.deleteWords(Emp(1,null,null))//删除id为1的
            }
        }
    }

    private fun updateView() {
        lifecycleScope.launch {
            withContext(Dispatchers.Default) {
                wordDao.updateWords(Emp(7,"update","修改了"))
            }
        }
    }

    private fun insertView() {
        lifecycleScope.launch {
            withContext(Dispatchers.Default) {
                wordDao.insertWords(Emp(null, "Hello", "你好"))
            }
        }
    }

    private fun initData() {
        lifecycleScope.launch {
            val text = StringBuffer()
            withContext(Dispatchers.Default) {
                val allWordsItems = wordDao.getAllWords()
                allWordsItems.forEach {
                    text.append("id:${it.id} , ${it.word} = ${it.chineseMeaning}\n")
                }
            }
            textview.text = text
        }
    }

}

总结

需要完整代码的下方评论邮箱,下一章讲使用 Room 方面的实践经验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值