2、添加依赖
1 2 3 | dependencies { implementation "androidx.room:room-ktx:2.4.0" } |
2、Entity
Entity是指代表数据库中的表的类,可以使用注解来定义表中的列。一个Entity类应该至少有一个主键字段,并且可以包含其他字段,如下面的例子所示:
1 2 3 4 5 6 | @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示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Dao interface UserDao { @Query ( "SELECT * FROM user" ) fun getAll(): List<User> @Query ( "SELECT * FROM user WHERE id = :id" ) fun getById(id: Int): User? @Insert fun insert(user: User) @Update fun update(user: User) @Delete fun delete(user: User) } |
4、Database
Database是指数据库对象,包含与数据库相关的配置信息,如版本号和实体类的列表。可以使用注解来指定数据库的配置信息和包含的实体类,如下面的例子所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Database (entities = [User:: class ], version = 1 ) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao companion object { private var INSTANCE: AppDatabase? = null fun getInstance(context: Context): AppDatabase { return INSTANCE ?: synchronized ( this ) { val instance = Room.databaseBuilder( context.applicationContext, AppDatabase:: class .java, "app_database" ).build() INSTANCE = instance instance } } } } |
5、获取DAO实例
使用Database对象的实例方法获取DAO接口的实例
1 2 | val db = AppDatabase.getInstance(context) val userDao = db.userDao() |
6、调用DAO方法
使用DAO接口的实例方法来访问数据库
1 2 3 4 5 6 7 | 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注解来指定一个方法是事务,例如:
1 2 3 4 5 | @Transaction fun updateUserData(user: User, address: Address) { userDao.update(user) addressDao.update(address) } |
9、数据库迁移
当你需要修改数据库架构时,可以使用Room的数据库迁移功能来升级或降级数据库。在Room中,可以使用@Database注解中的version属性来指定数据库版本号,如果你需要进行迁移,你可以创建一个Migration对象,它包含了旧版本到新版本的变化信息,并将其添加到@Database注解中的migrations属性中,例如:
1 2 3 4 5 6 7 8 | @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注解来指定视图的查询语句,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @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和网络请求,做很酷的事情
1 2 3 4 5 6 7 8 | @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>> } |