快速瞭解Android Room使用細則
1、前言
最近在開發中,Room用的比較多,時不時要查資料,幹脆寫一篇Room的使用和Room的封裝。如果寫的不好,或者有錯誤之處,懇請在評論、私信、郵箱指出,萬分感謝🙏
2、添加依賴
dependencies { implementation "androidx.room:room-ktx:2.4.0" }
2、Entity
Entity是指代表數據庫中的表的類,可以使用註解來定義表中的列。一個Entity類應該至少有一個主鍵字段,並且可以包含其他字段,如下面的例子所示:
@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示例:
@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是指數據庫對象,包含與數據庫相關的配置信息,如版本號和實體類的列表。可以使用註解來指定數據庫的配置信息和包含的實體類,如下面的例子所示:
@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接口的實例
val db = AppDatabase.getInstance(context) val userDao = db.userDao()
6、調用DAO方法
使用DAO接口的實例方法來訪問數據庫
val users = userDao.getAll() val user = userDao.getById(1) val newUser = User(2, "雞你太美", "[email protected]") userDao.insert(newUser) newUser.email = "[email protected]" 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註解來指定一個方法是事務,例如:
@Transaction fun updateUserData(user: User, address: Address) { userDao.update(user) addressDao.update(address) }
9、數據庫遷移
當你需要修改數據庫架構時,可以使用Room的數據庫遷移功能來升級或降級數據庫。在Room中,可以使用@Database註解中的version屬性來指定數據庫版本號,如果你需要進行遷移,你可以創建一個Migration對象,它包含瞭舊版本到新版本的變化信息,並將其添加到@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)
在一些情況下,你可能需要使用多個表中的數據來創建一個視圖(數據庫視圖!不是android.view)。在Room中,你可以使用@DatabaseView註解來定義一個視圖,並使用@Query註解來指定視圖的查詢語句,例如:
@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和網絡請求,做很酷的事情
@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>> }
結尾
實際上,Room的應用遠不止如此,如果有人感興趣的話,我就出下一期吧!比如封裝一個Room的數據庫層
感謝
- 校稿:ChatGpt/Bing
- 文筆優化:ChatGpt/Bing/秘塔寫作貓
以上就是快速瞭解Android Room使用細則的詳細內容,更多關於Android Room使用的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 快速瞭解Android Room使用細則進階
- Android開發Jetpack組件Room用例講解
- Android kotlin+協程+Room數據庫的簡單使用
- Android Jetpack中Room的使用
- 新手瞭解java 泛型基礎知識