设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 喜欢你每天的一句晚安,那比任何甜言蜜语听起来都幸福。

喜欢你每天的一句晚安,那比任何甜言蜜语听起来都幸福。

查看: 1355|回复: 2

快速了解Android Room使用细则

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:21
  • 打卡月天数:0
  • 打卡总奖励:274
  • 最近打卡:2025-04-21 07:48:29
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
390
主题
358
精华
0
金钱
1417
积分
794
注册时间
2023-2-10
最后登录
2025-6-2

发表于 2023-3-3 09:58:18 | 显示全部楼层 |阅读模式
1、前言

最近在开发中,Room用的比较多,时不时要查资料,干脆写一篇Room的使用和Room的封装。如果写的不好,或者有错误之处,恳请在评论、私信、邮箱指出,万分感谢🙏

2、添加依赖
  1. dependencies {
  2.     implementation "androidx.room:room-ktx:2.4.0"
  3. }
复制代码
2、Entity

Entity是指代表数据库中的表的类,可以使用注解来定义表中的列。一个Entity类应该至少有一个主键字段,并且可以包含其他字段,如下面的例子所示:
  1. @Entity(tableName = "user")
  2. data class User(
  3.     @PrimaryKey val id: Int,
  4.     @ColumnInfo(name = "name") val name: String,
  5.     @ColumnInfo(name = "email") val email: String
  6. )
复制代码
3、DAO

DAO是指数据访问对象,用于定义访问数据库的方法。可以使用注解来指定SQL查询,也可以使用Room提供的一些查询方法。例如,以下是一个包含一些基本查询的DAO示例:
  1. @Dao
  2. interface UserDao {
  3.     @Query("SELECT * FROM user")
  4.     fun getAll(): List<User>

  5.     @Query("SELECT * FROM user WHERE id = :id")
  6.     fun getById(id: Int): User?

  7.     @Insert
  8.     fun insert(user: User)

  9.     @Update
  10.     fun update(user: User)

  11.     @Delete
  12.     fun delete(user: User)
  13. }
复制代码
4、Database

Database是指数据库对象,包含与数据库相关的配置信息,如版本号和实体类的列表。可以使用注解来指定数据库的配置信息和包含的实体类,如下面的例子所示:
  1. @Database(entities = [User::class], version = 1)
  2. abstract class AppDatabase : RoomDatabase() {
  3.     abstract fun userDao(): UserDao

  4.     companion object {
  5.         private var INSTANCE: AppDatabase? = null

  6.         fun getInstance(context: Context): AppDatabase {
  7.             return INSTANCE ?: synchronized(this) {
  8.                 val instance = Room.databaseBuilder(
  9.                     context.applicationContext,
  10.                     AppDatabase::class.java,
  11.                     "app_database"
  12.                 ).build()
  13.                 INSTANCE = instance
  14.                 instance
  15.             }
  16.         }
  17.     }
  18. }
复制代码
5、获取DAO实例

使用Database对象的实例方法获取DAO接口的实例
  1. val db = AppDatabase.getInstance(context)
  2. val userDao = db.userDao()
复制代码
6、调用DAO方法

使用DAO接口的实例方法来访问数据库
  1. val users = userDao.getAll()
  2. val user = userDao.getById(1)
  3. val newUser = User(2, "鸡你太美", "jinitaimei@qq.com")
  4. userDao.insert(newUser)
  5. newUser.email = "jinitaimei@qq.com"
  6. userDao.update(newUser)
  7. userDao.delete(newUser)
复制代码
7、使用步骤

以上是Room的三个主要组成部分,下面是使用Room的一些基本步骤:

  • 添加依赖项:在项目的build.gradle文件中添加Room库的依赖项。
  • 创建Entity类:创建一个或多个Entity类来表示数据库中的表。
  • 创建DAO接口:创建一个或多个DAO接口来定义访问数据库的方法。
  • 创建Database对象:创建一个继承自RoomDatabase的抽象类来表示数据库对象,并使用@Database注解指定数据库的配置信息和包含的实体类。
  • 获取DAO实例:使用Database对象的实例方法获取DAO接口的实例。
  • 调用DAO方法:使用DAO接口的实例方法来访问数据库。
下面说点其他的,嘻嘻

8、事务(Transaction)

在对数据库进行多次操作时,可以使用事务来保证数据的一致性和完整性。在Room中,可以使用@Transaction注解来指定一个方法是事务,例如:
  1. @Transaction
  2. fun updateUserData(user: User, address: Address) {
  3.     userDao.update(user)
  4.     addressDao.update(address)
  5. }
复制代码
9、数据库迁移

当你需要修改数据库架构时,可以使用Room的数据库迁移功能来升级或降级数据库。在Room中,可以使用@Database注解中的version属性来指定数据库版本号,如果你需要进行迁移,你可以创建一个Migration对象,它包含了旧版本到新版本的变化信息,并将其添加到@Database注解中的migrations属性中,例如:
  1. @Database(entities = [User::class], version = 2, exportSchema = false,
  2.     migrations = [Migration(1, 2) { database ->
  3.         database.execSQL("ALTER TABLE user ADD COLUMN phone TEXT NOT NULL DEFAULT ''")
  4.     }]
  5. )
  6. abstract class AppDatabase : RoomDatabase() {
  7.     // ...
  8. }
复制代码
10、视图(View)

在一些情况下,你可能需要使用多个表中的数据来创建一个视图(数据库视图!不是android.view)。在Room中,你可以使用@DatabaseView注解来定义一个视图,并使用@Query注解来指定视图的查询语句,例如:
  1. @DatabaseView(
  2.     "SELECT user.id, user.name, address.city, address.country FROM user " +
  3.     "INNER JOIN address ON user.address_id = address.id"
  4. )
  5. data class UserAddress(
  6.     val id: Int,
  7.     val name: String,
  8.     val city: String,
  9.     val country: String
  10. )

  11. @Dao
  12. interface UserAddressDao {
  13.     @Query("SELECT * FROM user_address")
  14.     fun getAll(): List<UserAddress>
  15. }
复制代码
11、Flow!

实际上也支持RXJava,但是我不喜欢RX,可以结合Room、Flow和网络请求,做很酷的事情
  1. @Dao
  2. interface UserDao {
  3.         @Query("SELECT * FROM user WHERE id = :id")
  4.     fun getById(id: Int): Flow<User>

  5.     @Query("SELECT * FROM user")
  6.     fun getAll(): Flow<List<User>>
  7. }
复制代码
结尾

实际上,Room的应用远不止如此,如果有人感兴趣的话,我就出下一期吧!比如封装一个Room的数据库层
感谢

  • 校稿:ChatGpt/Bing
  • 文笔优化:ChatGpt/Bing/秘塔写作猫
以上就是快速了解Android Room使用细则的详细内容,更多关于Android Room使用的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
12
积分
4
注册时间
2023-12-19
最后登录
2023-12-19

发表于 2024-10-8 03:17:51 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
19
积分
18
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2025-4-6 05:42:28 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表