提示:以下是本篇文章正文内容,下面案例可供参考
一、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 方面的实践经验