当前位置: 首页 > news >正文

Room数据库

Room数据库

Room是Android Jetpack组件中的一款SQLite数据库抽象层框架,旨在简化本地数据库操作,提供编译时SQL校验、类型与安全、与LiveData/Flow无缝集成等特性。


1. 什么是Room

定义:

  • Room 是 Android Jetpack 提供的一个 ORM(对象关系映射)库,用于简化 SQLite 数据库操作。它将 SQLite 表映射为 Java/Kotlin 对象,通过注解自动生成数据库操作代码,避免手动编写 SQL 语句,提升开发效率和代码可维护性。

优势:

  • 类型安全:编译时检查SQL查询,避免运行时错误。
  • 减少样板代码:通过注解自动生成数据库操作代码。
  • LiveData支持:与数据观察机制无缝集成,数据变化时自动通知UI。

2. Room的核心组件

Room框架由三个核心组件构成:

  • Entity(实体类):
    • 定义数据库中的表结构,每个Entity对应一张表。
    • 通过注解配置字段、主键、索引等。
  • DAO(Data Access Object,数据访问对象):
    • 定义操作数据库的方法(增删改查)。
    • 使用@Query、@Insert、@Update、@Delete等注解声明SQL操作。
  • Database(数据库类):
    • 作为数据库的入口,继承自RoomDatabase。
    • 定义数据库版本、包含的Entity列表,并提供DAO的抽象方法。

3. Room的使用

1. 添加依赖:在 build.gradle 中添加 Room 依赖:

dependencies {def room_version = "2.6.1"implementation "androidx.room:room-runtime:$room_version"kapt "androidx.room:room-compiler:$room_version"  // Kotlin 使用 kaptimplementation "androidx.room:room-ktx:$room_version"  // 协程支持
}

2. 定义Entity

@Entity(tableName = "users")
data class User(@PrimaryKey(autoGenerate = true) val id: Int = 0,@ColumnInfo(name = "user_name") val name: String,@ColumnInfo(index = true) val age: Int  // 创建索引
)
  • @Entity:标记为数据库表。

  • @PrimaryKey:定义主键,autoGenerate 表示自增。

  • @ColumnInfo:自定义列名或添加索引。

3. 自定义DAO

@Dao
interface UserDao {@Insert(onConflict = OnConflictStrategy.REPLACE)suspend fun insert(user: User)@Deletesuspend fun delete(user: User)@Query("SELECT * FROM users WHERE age > :minAge")fun getUsersOlderThan(minAge: Int): Flow<List<User>>
}
  • @Insert/@Update/@Delete:简化增删改操作。

  • @Query:自定义 SQL 查询,支持参数绑定。

  • suspend:结合协程实现异步操作。

  • Flow:返回响应式数据流(需配合 Room 和 Kotlin 协程)。

4. 定义Database

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {abstract fun userDao(): UserDaocompanion object {private var instance: AppDatabase? = nullfun getInstance(context: Context): AppDatabase {return instance ?: synchronized(this) {instance ?: Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"app_database").build().also { instance = it }}}}
}
  • @Database:声明数据库版本和包含的 Entity。

  • 单例模式:确保全局唯一数据库实例。

  • Room.databaseBuilder:创建数据库实例。

4. Room与MVVM的整合

在MVVM架构中,Room通常通过Repository层被ViewModel调用。

  1. Entity:对应数据模型。
  2. DAO:定义数据操作接口。
  3. Repository:封装数据来源(Room 或网络),为 ViewModel 提供统一接口。
  4. ViewModel:通过 LiveData 暴露数据给 UI。
class UserRepository(private val userDao: UserDao) {val users: Flow<List<User>> = userDao.getAllUsers()suspend fun insert(user: User) = userDao.insert(user)
}class UserViewModel(private val repository: UserRepository) : ViewModel() {val users: Flow<List<User>> = repository.usersfun addUser(name: String, age: Int) {viewModelScope.launch {repository.insert(User(name = name, age = age))}}
}

http://www.dtcms.com/a/194012.html

相关文章:

  • 筑牢信息安全防线:涉密计算机与互联网隔离的理论实践与风险防控
  • 【pbootcms】打开访问首页显示未检测到您服务器环境的sqlite3数据库拓展,请检查php.ini中是否已经开启该拓展
  • 现代计算机图形学Games101入门笔记(十二)
  • React中使用openLayer画地图
  • 拟合(最小二乘拟合)
  • React Flow 节点类型详解与实战:内置节点使用与自定义组件开发
  • 58. 区间和
  • 【GaussDB迁移攻略】DRS支持CDC,解决大规模数据迁移挑战
  • 【软件工程】符号执行与约束求解缺陷检测方法
  • 前端精度问题全解析:用“挖掘机”快速“填平精度坑”的完美解决方案
  • 深入探索:Core Web Vitals 进阶优化与新兴指标
  • AWS云入门宝典
  • 哈希表实现(1):
  • Spring Cloud:Gateway(统一服务入口)
  • R语言学习--Day03--数据清洗技巧
  • 【学习笔记】计算机操作系统(四)—— 存储器管理
  • 懒汉式单例模式的线程安全实现
  • 医疗机械中丝杆支撑座有什么特殊要求?
  • 案例分析组合投资策略的回测与绩效分析
  • LLM学习笔记(六)线性代数
  • buuctf Crypto-鸡藕椒盐味1
  • Rust 数据结构:String
  • 后端框架(3):Spring(1)
  • IntelliJ IDEA打开项目后,目录和文件都不显示,只显示pom.xml,怎样可以再显示出来?
  • 西门子 S1500 PLC 通过 Profinet 对 6 台施耐德 ATV304 变频器的控制,用于 6 台升降台的位置控制。
  • Lua中使用module时踩过的坑
  • K8S从Harbor拉取镜像
  • Go语言处理HTTP下载中EOFFailed
  • Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件
  • 力扣654题:最大二叉树(递归)