Android項(xiàng)目中使用Jetpack-Room

在 Android 項(xiàng)目中使用 Room 可以通過(guò)以下步驟實(shí)現(xiàn):
1帆喇、添加 Room 的依賴(lài)
在項(xiàng)目的 build.gradle 文件中添加以下依賴(lài):

dependencies {
    ...
    implementation "androidx.room:room-runtime:<version>"
    kapt "androidx.room:room-compiler:<version>"
}

2、創(chuàng)建 Entity
使用 @Entity 注解創(chuàng)建一個(gè)數(shù)據(jù)表實(shí)體類(lèi)亿胸,其中可以使用 @PrimaryKey 注解設(shè)置主鍵坯钦,@ColumnInfo 注解設(shè)置列名等。

例如:

@Entity(tableName = "users")
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "name") val name: String,
    @ColumnInfo(name = "email") val email: String
)

3损敷、創(chuàng)建 DAO
使用 @Dao 注解創(chuàng)建數(shù)據(jù)訪問(wèn)對(duì)象葫笼,定義訪問(wèn)數(shù)據(jù)庫(kù)的方法∞致可以使用 @Query 注解執(zhí)行 SQL 查詢(xún)路星,也可以使用其他注解進(jìn)行數(shù)據(jù)操作。
例如:

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAll(): List<User>

    @Insert
    fun insertAll(vararg users: User)
}

4诱桂、創(chuàng)建 Room 數(shù)據(jù)庫(kù)
使用 @Database 注解創(chuàng)建 Room 數(shù)據(jù)庫(kù)洋丐,并指定包含 Entity 的數(shù)組和版本號(hào)。

例如:

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
   abstract fun userDao(): UserDao
}

5挥等、初始化 Room 數(shù)據(jù)庫(kù)
在 Application 類(lèi)中創(chuàng)建 Room 數(shù)據(jù)庫(kù)的實(shí)例友绝。

例如:

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

@HiltAndroidApp
class MyApplication : Application() {
    val db = Room.databaseBuilder(
        applicationContext,
        AppDatabase::class.java, "my-database"
    ).build()
}

6、使用 Room 數(shù)據(jù)庫(kù)
通過(guò) Room 數(shù)據(jù)庫(kù)的實(shí)例訪問(wèn) DAO肝劲,執(zhí)行數(shù)據(jù)操作迁客。

例如:

val userDao = (application as MyApplication).db.userDao()

val users = userDao.getAll()

userDao.insertAll(User(1, "Alice", "alice@example.com"))

以上是在 Android 項(xiàng)目中使用 Room 的基本步驟,可以根據(jù)實(shí)際需求進(jìn)行調(diào)整辞槐。

除了基本的使用方法之外掷漱,Room 還提供了以下功能:
(1)、使用 LiveData 自動(dòng)更新 UI
可以在 DAO 的查詢(xún)方法上使用 LiveData 返回?cái)?shù)據(jù)榄檬,從而在數(shù)據(jù)變化時(shí)自動(dòng)更新 UI卜范。

例如:

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAll(): LiveData<List<User>>
}

在 UI 組件中觀察 LiveData,當(dāng)數(shù)據(jù)變化時(shí)會(huì)自動(dòng)更新 UI鹿榜。

userViewModel.allUsers.observe(this, Observer { users ->
    // Update UI
})

(2)海雪、使用關(guān)系映射
可以在 Entity 類(lèi)中使用 @Relation 注解定義與其他表的關(guān)系,從而方便地訪問(wèn)關(guān)聯(lián)數(shù)據(jù)舱殿。

例如:

data class UserWithPets(
    @Embedded val user: User,
    @Relation(
        parentColumn = "id",
        entityColumn = "user_id"
    )
    val pets: List<Pet>
)

在 DAO 中查詢(xún)數(shù)據(jù)時(shí)奥裸,使用 @Transaction 注解可以在單個(gè)事務(wù)中執(zhí)行多個(gè)操作。

例如:

@Transaction
@Query("SELECT * FROM users WHERE id = :userId")
fun getUserWithPets(userId: Int): LiveData<UserWithPets>

(3)怀薛、數(shù)據(jù)庫(kù)遷移
當(dāng)需要更改數(shù)據(jù)庫(kù)結(jié)構(gòu)時(shí)刺彩,可以使用 Room 提供的數(shù)據(jù)庫(kù)遷移機(jī)制。在 AppDatabase 中使用 @Database 注解時(shí)指定 migration 數(shù)組枝恋,即可在升級(jí)版本時(shí)執(zhí)行相應(yīng)的遷移操作创倔。

例如:

@Database(entities = [User::class], version = 2, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
    ...
    companion object {
        val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE users ADD COLUMN age INTEGER NOT NULL DEFAULT 0")
            }
        }
    }
    ...
}

在創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例時(shí)指定 migration 數(shù)組即可進(jìn)行數(shù)據(jù)遷移。

例如:

val db = Room.databaseBuilder(
    applicationContext,
    AppDatabase::class.java,
    "my-database"
)
.addMigrations(AppDatabase.MIGRATION_1_2)
.build()

(4)焚碌、使用 TypeConverters 進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換
在 Entity 類(lèi)中可以使用 @TypeConverters 注解指定一個(gè)或多個(gè)類(lèi)型轉(zhuǎn)換器畦攘,將不支持的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為 Room 支持的數(shù)據(jù)類(lèi)型,或?qū)?Room 支持的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為應(yīng)用程序中的自定義類(lèi)型十电。

例如:

@Entity
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "name") val name: String,
    @ColumnInfo(name = "birthdate") val birthdate: Date
)

class Converters {
    @TypeConverter
    fun fromTimestamp(value: Long?): Date? {
        return value?.let { Date(it) }
    }

    @TypeConverter
    fun dateToTimestamp(date: Date?): Long? {
        return date?.time
    }
}

@Database(entities = [User::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
    ...
}

(5)知押、使用 RxJava 進(jìn)行異步操作
在 DAO 中使用 RxJava 的 Observable 或 Single 對(duì)象,可以進(jìn)行異步數(shù)據(jù)操作鹃骂,并使用 RxJava 提供的操作符進(jìn)行數(shù)據(jù)轉(zhuǎn)換台盯、篩選、組合等操作畏线。
例如:

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAll(): Observable<List<User>>

    @Insert
    fun insert(user: User): Single<Long>
}

userDao.getAll()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { users ->
        // Update UI
    }

userDao.insert(User(1, "Alice", Date()))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { id ->
        // Show success message
    }

(6)静盅、使用協(xié)程進(jìn)行異步操作
在 DAO 中使用協(xié)程的 suspend 函數(shù),可以進(jìn)行異步數(shù)據(jù)操作寝殴,并使用協(xié)程提供的操作符進(jìn)行數(shù)據(jù)轉(zhuǎn)換蒿叠、篩選、組合等操作蚣常。

例如:

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    suspend fun getAll(): List<User>

    @Insert
    suspend fun insert(user: User): Long
}

GlobalScope.launch(Dispatchers.IO) {
    val users = userDao.getAll()
    withContext(Dispatchers.Main) {
        // Update UI
    }
}

GlobalScope.launch(Dispatchers.IO) {
    val id = userDao.insert(User(1, "Alice", Date()))
    withContext(Dispatchers.Main) {
        // Show success message
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末市咽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抵蚊,更是在濱河造成了極大的恐慌施绎,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞绳,死亡現(xiàn)場(chǎng)離奇詭異谷醉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)熔酷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)孤紧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拒秘,你說(shuō)我怎么就攤上這事号显。” “怎么了躺酒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵押蚤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我羹应,道長(zhǎng)揽碘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮雳刺,結(jié)果婚禮上劫灶,老公的妹妹穿的比我還像新娘。我一直安慰自己掖桦,他們只是感情好本昏,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著枪汪,像睡著了一般涌穆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雀久,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天宿稀,我揣著相機(jī)與錄音,去河邊找鬼赖捌。 笑死祝沸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巡蘸。 我是一名探鬼主播奋隶,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悦荒!你這毒婦竟也來(lái)了唯欣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搬味,失蹤者是張志新(化名)和其女友劉穎境氢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碰纬,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萍聊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悦析。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寿桨。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖强戴,靈堂內(nèi)的尸體忽然破棺而出亭螟,到底是詐尸還是另有隱情,我是刑警寧澤骑歹,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布预烙,位于F島的核電站,受9級(jí)特大地震影響道媚,放射性物質(zhì)發(fā)生泄漏扁掸。R本人自食惡果不足惜翘县,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谴分。 院中可真熱鬧锈麸,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至晃财,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扛伍,已是汗流浹背掂榔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熟丸,地道東北人训措。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像光羞,于是被迫代替她去往敵國(guó)和親绩鸣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 有時(shí)我們想顯示一個(gè)關(guān)于列表項(xiàng)的額外內(nèi)容纱兑,它不一定需要一個(gè)單獨(dú)的屏幕呀闻,通常稱(chēng)為詳細(xì)屏幕,這就是 Expandable...
    安安_660c閱讀 878評(píng)論 0 3
  • 介紹 Room是Google提供的一個(gè)ORM庫(kù)潜慎。Room提供了三個(gè)主要的組件: @Database:@Databa...
    Carve_Time閱讀 61,580評(píng)論 11 106
  • 一捡多、概述 Room提供了一個(gè)訪問(wèn)SQLite的抽象層,以便在利用SQLite的全部功能的同時(shí)進(jìn)行流暢的數(shù)據(jù)庫(kù)訪問(wèn)铐炫。...
    小村醫(yī)閱讀 23,064評(píng)論 4 17
  • 定義 本地保存數(shù)據(jù)的一種方式垒手,處理大量結(jié)構(gòu)化數(shù)據(jù)。最常見(jiàn)的使用場(chǎng)景是緩存相關(guān)的數(shù)據(jù)倒信。 優(yōu)勢(shì) 針對(duì)SQL查詢(xún)的編譯時(shí)...
    安安_660c閱讀 694評(píng)論 0 2
  • 原文地址:Android Room with a view Android推薦的架構(gòu)組件 Entity: 當(dāng)使用架...
    nxiangbo閱讀 18,162評(píng)論 1 16