1、前言
最近在开发中,Room用的比较多,时不时要查资料,干脆写一篇Room的使用和Room的封装。如果写的不好,或者有错误之处,恳请在评论、私信、邮箱指出,万分感谢🙏
2、添加依赖
dependencies {implementation "androidx.room:room-ktx:2.4.0"
}
2、Entity
Entity是指代表数据库中的表的类,可以使用注解来定义表中的列。一个Entity类应该至少有一个主键字段,并且可以包含其他字段,如下面的例子所示:
@Entity(tableName = "user")
data class User(@PrimaryKey val id: Int,@ColumnInfo(name = "name") val name: String,@ColumnInfo(name = "email") val email: String
)
3、DAO
DAO是指数据访问对象,用于定义访问数据库的方法。可以使用注解来指定SQL查询,也可以使用Room提供的一些查询方法。例如,以下是一个包含一些基本查询的DAO示例:
@Dao
interface UserDao {@Query("SELECT * FROM user")fun getAll(): List<User>@Query("SELECT * FROM user WHERE id = :id")fun getById(id: Int): User?@Insertfun insert(user: User)@Updatefun update(user: User)@Deletefun delete(user: User)
}
4、Database
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) {val instance = Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"app_database").build()INSTANCE = instanceinstance}}}
}
5、获取DAO实例
使用Database对象的实例方法获取DAO接口的实例
val db = AppDatabase.getInstance(context)
val userDao = db.userDao()
6、调用DAO方法
使用DAO接口的实例方法来访问数据库
val users = userDao.getAll()
val user = userDao.getById(1)
val newUser = User(2, "鸡你太美", "jinitaimei@qq.com")
userDao.insert(newUser)
newUser.email = "jinitaimei@qq.com"
userDao.update(newUser)
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注解来指定一个方法是事务,例如:
@Transaction
fun updateUserData(user: User, address: Address) {userDao.update(user)addressDao.update(address)
}
9、数据库迁移
当你需要修改数据库架构时,可以使用Room的数据库迁移功能来升级或降级数据库。在Room中,可以使用@Database注解中的version属性来指定数据库版本号,如果你需要进行迁移,你可以创建一个Migration对象,它包含了旧版本到新版本的变化信息,并将其添加到@Database注解中的migrations属性中,例如:
@Database(entities = [User::class], version = 2, exportSchema = false,migrations = [Migration(1, 2) { database ->database.execSQL("ALTER TABLE user ADD COLUMN phone TEXT NOT NULL DEFAULT ''")}]
)
abstract class AppDatabase : RoomDatabase() {// ...
}
10、视图(View)
在一些情况下,你可能需要使用多个表中的数据来创建一个视图(数据库视图!不是android.view)。在Room中,你可以使用@DatabaseView注解来定义一个视图,并使用@Query注解来指定视图的查询语句,例如:
@DatabaseView("SELECT user.id, user.name, address.city, address.country FROM user " +"INNER JOIN address ON user.address_id = address.id"
)
data class UserAddress(val id: Int,val name: String,val city: String,val country: String
)@Dao
interface UserAddressDao {@Query("SELECT * FROM user_address")fun getAll(): List<UserAddress>
}
11、Flow!
实际上也支持RXJava,但是我不喜欢RX,可以结合Room、Flow和网络请求,做很酷的事情
@Dao
interface UserDao {@Query("SELECT * FROM user WHERE id = :id")fun getById(id: Int): Flow<User>@Query("SELECT * FROM user")fun getAll(): Flow<List<User>>
}
12、结尾
实际上,Room的应用远不止如此,如果有人感兴趣的话,我就出下一期吧!比如封装一个Room的数据库层
13、感谢
- 校稿:ChatGpt/Bing
- 文笔优化:ChatGpt/Bing/秘塔写作猫
“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情”
作者:AlbertZein
链接:https://juejin.cn/post/7203911920637968444
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
全套视频资料:
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓