快速了解Android Room使用細(xì)則
1、前言
最近在開發(fā)中,Room用的比較多,時(shí)不時(shí)要查資料,干脆寫一篇Room的使用和Room的封裝。如果寫的不好,或者有錯(cuò)誤之處,懇請(qǐng)?jiān)谠u(píng)論、私信、郵箱指出,萬(wàn)分感謝??
2、添加依賴
dependencies { implementation "androidx.room:room-ktx:2.4.0" }
2、Entity
Entity是指代表數(shù)據(jù)庫(kù)中的表的類,可以使用注解來(lái)定義表中的列。一個(gè)Entity類應(yīng)該至少有一個(gè)主鍵字段,并且可以包含其他字段,如下面的例子所示:
@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是指數(shù)據(jù)訪問(wèn)對(duì)象,用于定義訪問(wèn)數(shù)據(jù)庫(kù)的方法。可以使用注解來(lái)指定SQL查詢,也可以使用Room提供的一些查詢方法。例如,以下是一個(gè)包含一些基本查詢的DAO示例:
@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是指數(shù)據(jù)庫(kù)對(duì)象,包含與數(shù)據(jù)庫(kù)相關(guān)的配置信息,如版本號(hào)和實(shí)體類的列表??梢允褂米⒔鈦?lái)指定數(shù)據(jù)庫(kù)的配置信息和包含的實(shí)體類,如下面的例子所示:
@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實(shí)例
使用Database對(duì)象的實(shí)例方法獲取DAO接口的實(shí)例
val db = AppDatabase.getInstance(context) val userDao = db.userDao()
6、調(diào)用DAO方法
使用DAO接口的實(shí)例方法來(lái)訪問(wèn)數(shù)據(jù)庫(kù)
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的三個(gè)主要組成部分,下面是使用Room的一些基本步驟:
- 添加依賴項(xiàng):在項(xiàng)目的build.gradle文件中添加Room庫(kù)的依賴項(xiàng)。
- 創(chuàng)建Entity類:創(chuàng)建一個(gè)或多個(gè)Entity類來(lái)表示數(shù)據(jù)庫(kù)中的表。
- 創(chuàng)建DAO接口:創(chuàng)建一個(gè)或多個(gè)DAO接口來(lái)定義訪問(wèn)數(shù)據(jù)庫(kù)的方法。
- 創(chuàng)建Database對(duì)象:創(chuàng)建一個(gè)繼承自RoomDatabase的抽象類來(lái)表示數(shù)據(jù)庫(kù)對(duì)象,并使用@Database注解指定數(shù)據(jù)庫(kù)的配置信息和包含的實(shí)體類。
- 獲取DAO實(shí)例:使用Database對(duì)象的實(shí)例方法獲取DAO接口的實(shí)例。
- 調(diào)用DAO方法:使用DAO接口的實(shí)例方法來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。
下面說(shuō)點(diǎn)其他的,嘻嘻
8、事務(wù)(Transaction)
在對(duì)數(shù)據(jù)庫(kù)進(jìn)行多次操作時(shí),可以使用事務(wù)來(lái)保證數(shù)據(jù)的一致性和完整性。在Room中,可以使用@Transaction注解來(lái)指定一個(gè)方法是事務(wù),例如:
@Transaction fun updateUserData(user: User, address: Address) { userDao.update(user) addressDao.update(address) }
9、數(shù)據(jù)庫(kù)遷移
當(dāng)你需要修改數(shù)據(jù)庫(kù)架構(gòu)時(shí),可以使用Room的數(shù)據(jù)庫(kù)遷移功能來(lái)升級(jí)或降級(jí)數(shù)據(jù)庫(kù)。在Room中,可以使用@Database注解中的version屬性來(lái)指定數(shù)據(jù)庫(kù)版本號(hào),如果你需要進(jìn)行遷移,你可以創(chuàng)建一個(gè)Migration對(duì)象,它包含了舊版本到新版本的變化信息,并將其添加到@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)
在一些情況下,你可能需要使用多個(gè)表中的數(shù)據(jù)來(lái)創(chuàng)建一個(gè)視圖(數(shù)據(jù)庫(kù)視圖!不是android.view)。在Room中,你可以使用@DatabaseView注解來(lái)定義一個(gè)視圖,并使用@Query注解來(lái)指定視圖的查詢語(yǔ)句,例如:
@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!
實(shí)際上也支持RXJava,但是我不喜歡RX,可以結(jié)合Room、Flow和網(wǎng)絡(luò)請(qǐng)求,做很酷的事情
@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>> }
結(jié)尾
實(shí)際上,Room的應(yīng)用遠(yuǎn)不止如此,如果有人感興趣的話,我就出下一期吧!比如封裝一個(gè)Room的數(shù)據(jù)庫(kù)層
感謝
- 校稿:ChatGpt/Bing
- 文筆優(yōu)化:ChatGpt/Bing/秘塔寫作貓
以上就是快速了解Android Room使用細(xì)則的詳細(xì)內(nèi)容,更多關(guān)于Android Room使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 關(guān)閉多個(gè)Activity的實(shí)現(xiàn)方法
這篇文章主要介紹了Android 關(guān)閉多個(gè)Activity的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09Android實(shí)現(xiàn)朋友圈點(diǎn)贊列表
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)朋友圈點(diǎn)贊列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Flutter-AnimatedWidget組件源碼示例解析
這篇文章主要為大家介紹了Flutter-AnimatedWidget組件源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Android開發(fā)之刪除項(xiàng)目緩存的方法
這篇文章主要介紹了Android開發(fā)之刪除項(xiàng)目緩存的方法,結(jié)合實(shí)例形式分析了Android開發(fā)中關(guān)于緩存的設(shè)置與刪除技巧,需要的朋友可以參考下2016-02-02Android Studio如何獲取SQLite數(shù)據(jù)并顯示到ListView上
這篇文章主要介紹了Android Studio獲取SQLite數(shù)據(jù)并顯示到ListView上,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Android Studio連接MySql實(shí)現(xiàn)登錄注冊(cè)(附源代碼)
登錄注冊(cè)是常用的一個(gè)功能,正好今天用android studio 做一個(gè)類似于這樣的登錄軟件,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-055個(gè)Android開發(fā)中比較常見(jiàn)的內(nèi)存泄漏問(wèn)題及解決辦法
本文主要介紹了5個(gè)Android開發(fā)中比較常見(jiàn)的內(nèi)存泄漏問(wèn)題及解決辦法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02Android Studio屏幕方向以及UI界面狀態(tài)的保存代碼詳解
在本篇文章里小編給各位整理的是關(guān)于Android Studio屏幕方向以及UI界面狀態(tài)的保存代碼以及相關(guān)知識(shí)點(diǎn),需要的跟著學(xué)習(xí)下。2019-10-10