在Android开发中,经常会用到SQLite数据库来存储数据,Room是Google推出的一个SQLite数据库封装库,主要用于简化SQLite的使用。
下面就介绍一下Room库的基础使用步骤,首先需要在gradle中添加Room依赖,room版本选择可以参考AndroidX 版本。
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"
Room库主要包括三种组件,数据实体(Entity)、数据访问类(DAO)和数据库类(Database)。
Room使用注解@Entity来标识数据实体,对应数据库中的一张表,@Entity中有很多参数可以指定,比如说tableName、indices等。使用@PrimaryKey来标识主键,使用@ColumnInfo来自定义字段。
1@Entity
2data class Item(
3 @PrimaryKey(autoGenerate = true)
4 val id: Int = 0,
5 @ColumnInfo(name = "name")
6 val itemName: String,
7 @ColumnInfo(name = "price")
8 val itemPrice: Double,
9 @ColumnInfo(name = "quantity")
10 val quantityInStock: Int
11)
Room使用注解@Dao来标识数据访问对象,在Dao中可以定义一些方法,用于提供数据库增@Insert、删@Delete、改@Update、查@Query的功能。
1@Dao
2interface ItemDao {
3
4 @Query("SELECT * from item ORDER BY name ASC")
5 fun getItems(): Flow<List<Item>>
6
7 @Query("SELECT * from item WHERE id = :id")
8 fun getItem(id: Int): Flow<Item>
9
10 @Insert(onConflict = OnConflictStrategy.IGNORE)
11 suspend fun insert(item: Item)
12
13 @Update
14 suspend fun update(item: Item)
15
16 @Delete
17 suspend fun delete(item: Item)
18}
Room使用注解@Database来标识数据库类,在@Database注解中,需要指定使用的数据实体类和数据访问对象,然后通过这些生成对应的数据库表和数据库增删改查操作的实现。
1@Database(entities = [Item::class], version = 1, exportSchema = false)
2abstract class ItemRoomDatabase : RoomDatabase() {
3
4 abstract fun itemDao(): ItemDao
5
6 companion object {
7 @Volatile
8 private var INSTANCE: ItemRoomDatabase? = null
9
10 fun getDatabase(context: Context): ItemRoomDatabase {
11 return INSTANCE ?: synchronized(this) {
12 val instance = Room.databaseBuilder(
13 context.applicationContext,
14 ItemRoomDatabase::class.java,
15 "item_database"
16 ).fallbackToDestructiveMigration().build()
17 INSTANCE = instance
18 return instance
19 }
20 }
21 }
22}
完整的示例代码如下
文件 | 大小 | 修改时间 |
---|---|---|
app | 2022年06月21日 | |
build.gradle | 2 kB | 2022年06月21日 |
code-of-conduct.md | 4 kB | 2022年06月21日 |
CONTRIBUTING.md | 1 kB | 2022年06月21日 |
gradle/wrapper | 2022年06月21日 | |
gradle.properties | 2 kB | 2022年06月21日 |
gradlew | 5 kB | 2022年06月21日 |
gradlew.bat | 2 kB | 2022年06月21日 |
LICENSE | 11 kB | 2022年06月21日 |
local.properties | 348 B | 2022年06月21日 |
README.md | 1 kB | 2022年06月21日 |
settings.gradle | 669 B | 2022年06月21日 |