Android-Kotlin基础(Jetpack④-Room)

Room 是 Jetpack 提供的一个 ORM(对象关系映射)库,简化了 Android 中的 SQLite 数据库操作,无需编写复杂的 SQL 语句就能实现数据的增删改查。

一、添加依赖

build.gradle(Module 级别)中添加以下依赖

复制代码
dependencies {
    // Room 核心库
    implementation "androidx.room:room-runtime:2.5.2"
    // 编译器(kapt 用于 Kotlin)
    kapt "androidx.room:room-compiler:2.5.2"
    // Kotlin 扩展(可选,提供协程支持)
    implementation "androidx.room:room-ktx:2.5.2"
}

二、核心组件

Room 有 3 个核心组件:

Entity:对应数据库中的表(用 @Entity 注解)

Dao:数据访问对象,定义增删改查方法(用 @Dao 注解)

Database:数据库持有者,管理连接(用 @Database 注解)

三、完整代码实现

1. 创建 Entity(数据模型类)
Kotlin 复制代码
import androidx.room.Entity
import androidx.room.PrimaryKey

// 定义数据库表(表名默认是类名,也可自定义)
@Entity(tableName = "users")
data class User(
    // 主键,autoGenerate = true 表示自增
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val name: String,
    val age: Int
)
2. 创建 Dao(数据访问接口)
Kotlin 复制代码
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import kotlinx.coroutines.flow.Flow

@Dao
interface UserDao {
    // 插入数据
    @Insert
    suspend fun insert(user: User)

    // 更新数据
    @Update
    suspend fun update(user: User)

    // 删除数据
    @Delete
    suspend fun delete(user: User)

    // 查询所有数据(返回 Flow,数据变化时自动通知)
    @Query("SELECT * FROM users ORDER BY id DESC")
    fun getAllUsers(): Flow<List<User>>

    // 根据 ID 查询
    @Query("SELECT * FROM users WHERE id = :id")
    suspend fun getUserById(id: Int): User?
}
3. 创建 Database 类
Kotlin 复制代码
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context

// 定义数据库,包含的表(entities)和版本号(version)
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
    // 提供 Dao 实例
    abstract fun userDao(): UserDao

    // 单例模式,避免重复创建数据库连接
    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getDatabase(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "user_database"  // 数据库名称
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}
4. 在 ViewModel 中使用
Kotlin 复制代码
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch

class UserViewModel(private val userDao: UserDao) : ViewModel() {
    // 将 Flow 转换为 LiveData,供 UI 观察
    val allUsers = userDao.getAllUsers().asLiveData()

    // 插入用户(在协程中执行,避免阻塞主线程)
    fun insertUser(user: User) {
        viewModelScope.launch {
            userDao.insert(user)
        }
    }

    // 更新用户
    fun updateUser(user: User) {
        viewModelScope.launch {
            userDao.update(user)
        }
    }

    // 删除用户
    fun deleteUser(user: User) {
        viewModelScope.launch {
            userDao.delete(user)
        }
    }
}
5. 在 Activity 中使用
Kotlin 复制代码
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.roomdemo.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var userViewModel: UserViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 获取数据库实例
        val db = AppDatabase.getDatabase(this)
        // 创建 ViewModel
        userViewModel = ViewModelProvider(this)[UserViewModel::class.java]

        // 观察用户列表变化,更新 RecyclerView
        userViewModel.allUsers.observe(this) { users ->
            // 这里可以更新 RecyclerView适配器
            // adapter.submitList(users)
        }

        // 点击按钮添加用户
        binding.btnAdd.setOnClickListener {
            val name = binding.etName.text.toString()
            val age = binding.etAge.text.toString().toIntOrNull() ?: 0
            if (name.isNotEmpty()) {
                userViewModel.insertUser(User(name = name, age = age))
            }
        }
    }
}

上面的 Room 示例代码遵循了 Android 推荐的MVVM 架构模式。

MVVM 是一种软件架构模式,广泛应用于 Android、iOS 等客户端开发中,核心是通过分层解耦,让代码更易于维护、测试和扩展。其名称由三个核心部分的首字母组成:Model(模型)、View(视图)、ViewModel(视图模型)

Model:管数据(存、取、处理)。

View:管界面(展示、交互)。

ViewModel:管逻辑(连接 View 和 Model,处理业务)。

viewModelScope 是 Jetpack ViewModel 库中专门为 ViewModel 设计的协程作用域(Coroutine Scope),用于在 ViewModel 中安全地启动和管理协程,避免内存泄漏和生命周期问题。

相关推荐
似霰几秒前
安卓系统属性之androidboot.xxx转换成ro.boot.xxx
android·gitee
zhang1062093 分钟前
PDF注释的加载和保存的实现
java·开发语言·pdf·pdfbox·批注
VBA633724 分钟前
VBA之Word应用第四章第一节:段落集合Paragraphs对象(一)
开发语言
0wioiw028 分钟前
Android-Kotlin基础(Jetpack①-ViewModel)
android
我是不会赢的44 分钟前
使用 decimal 包解决 go float 浮点数运算失真
开发语言·后端·golang·浮点数
胤祥矢量商铺1 小时前
菜鸟笔记007 [...c(e), ...d(i)]数组的新用法
c语言·开发语言·javascript·笔记·illustrator插件
用户2018792831671 小时前
限定参数范围的注解之 "咖啡店定价" 的故事
android·java
青红光硫化黑1 小时前
学习bug
开发语言·javascript·ecmascript
xzkyd outpaper2 小时前
Android中视图测量、布局、绘制过程
android
泓博2 小时前
Android底部导航栏图标变黑色
android