Android中Room的使用

2023-06-13  本文已影响0人  小城哇哇

Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。具体来说,Room 具有以下优势:

step1:app/build.gradle中引入room

implementation "androidx.room:room-ktx:2.2.5" 
kapt "androidx.room:room-compiler:2.2.5"

step2:创建实体类

这个类就是要存储的数据结构,通过@Entity(tableName="test_table")定义并指定表名。类中的每个属性代表表中的一。Room 最终会使用这些属性来创建表并将数据库行中的对象实例化

//声明数据表,并且指定数据表名称
@Entity(tableName = "test_table")
data class TestEntity(@PrimaryKey(autoGenerate = true) val id: Int, @ColumnInfo(name = "name")val name:String)
//如果列名也叫做word可以省略@ColumnInfo

step3:创建DAO

其实就是提供对数据表的增删改查。在 DAO(数据访问对象)中,您可以指定 SQL 查询并将其与方法调用相关联。编译器会检查 SQL 并根据常见查询的方便的注解(如 @Insert)生成查询。Room 会使用 DAO 为代码创建整洁的 API。DAO 必须是一个接口或抽象类。默认情况下,所有查询都必须在单独的线程上执行。Room 支持 Kotlin 协程,您可使用 suspend 修饰符对查询进行注解,然后从协程或其他挂起函数对其进行调用。

@Dao
    interface TestDao {
    @Query("SELECT * FROM test_table ORDER BY word ASC")
    fun getSavedEntities(): Flow<List<TestEntity>>

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insert(entity: TestEntity)

    @Query("DELETE FROM test_table")
    suspend fun deleteAll()
}

step4:实现room数据库。

Room 数据库类必须是抽象且必须扩展 RoomDatabase。整个应用通常只需要一个 Room 数据库实例。

@Database(entities = arrayOf(TestEntity::class), version = 1, exportSchema = false)
        public abstract class TestRoomDatabase : RoomDatabase() {
    abstract fun wordDao(): TestDao

    companion object {
        @Volatile
        private var INSTANCE: TestRoomDatabase? = null
        fun getDatabase(context: Context): TestRoomDatabase {
       
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    TestRoomDatabase::class.java,
                    "test_database"
                ).build()
                INSTANCE = instance
                // return instance
                instance
            }
        }
    }

}

step5:实在Repository中使用DAO

class TestRepository(private val testDao: TestDao) {

    val allEntities: Flow<List<TestEntity>> = testDao.getSavedEntities()

   
    @WorkerThread
    suspend fun insert(entity: TestEntity) {
        testDao.insert(entity)
    }
}

step6:实在ViewModel中使用Repository

这里利用了Hilt。首先在viewModel中查询所有结果,并且将flow转化为liveData,在需要的activity中注册监听。当数据库数据发生变化时,监听器就能收到相应的更改数据,比如调用insert之后

@HiltViewModel
class TestViewModel @Inject constructor(private val repository: TestRepository) :ViewModel() {
    val allWords: LiveData<List<Word>> = repository.allEntities.asLiveData()

    fun insert(entity: TestEntity) = viewModelScope.launch {
        repository.insert(entity)
    }
}

以上就是Room的简单使用。

上一篇 下一篇

猜你喜欢

热点阅读