前言
Room是對SQLite的封裝,官方推薦使用Room。該文檔來自google官方文檔。該文檔里的代碼是kotlin。
在數(shù)據(jù)庫中創(chuàng)建視圖
1. @DatabaseView創(chuàng)建視圖
@DatabaseView("SELECT user.id, user.name, user.departmentId," +
"department.name AS departmentName FROM user " +
"INNER JOIN department ON user.departmentId = department.id")
data class UserDetail(
var id: Long,
var name: String?,
var departmentId: Long,
var departmentName: String?
)
2. 關(guān)聯(lián)視圖
@Database(entities = arrayOf(User::class),
views = arrayOf(UserDetail::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
訪問數(shù)據(jù)
1. 插入insert, onConflict屬性是沖突解決的策略
@Dao
interface MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertUsers(vararg users: User)
@Insert
fun insertBothUsers(user1: User, user2: User)
@Insert
fun insertUsersAndFriends(user: User, friends: List<User>)
}
也可以設(shè)置返回值為long 、long[] 或 List<Long>類型,返回的是插入第幾行
2.更新update
@Dao
interface MyDao {
@Update
fun updateUsers(vararg users: User)
}
也可以返回int,代表更新的哪一行
3. 刪除delete
@Dao
interface MyDao {
@Delete
fun deleteUsers(vararg users: User)
}
也可以返回int,代表被刪除的行數(shù)
4. sql語句 query
@Dao
interface MyDao {
@Query("SELECT * FROM user")
fun loadAllUsers(): Array<User>
@Query("SELECT * FROM user WHERE age BETWEEN :minAge AND :maxAge")
fun loadAllUsersBetweenAges(minAge: Int, maxAge: Int): Array<User>
@Query("SELECT * FROM user WHERE first_name LIKE :search " +
"OR last_name LIKE :search")
fun findUserWithName(search: String): List<User>
@Query("SELECT first_name, last_name FROM user WHERE region IN (:regions)")
fun loadUsersFromRegions(regions: List<String>): List<NameTuple>
}
當(dāng)然,返回值也可以是lIveData
@Dao
interface MyDao {
@Query("SELECT first_name, last_name FROM user WHERE region IN (:regions)")
fun loadUsersFromRegionsSync(regions: List<String>): LiveData<List<User>>
}
也可以返回RxJava2類型
dependencies {
implementation 'androidx.room:room-rxjava2:2.1.0-alpha02'
}
@Dao
interface MyDao {
@Query("SELECT * from user where id = :id LIMIT 1")
fun loadUserById(id: Int): Flowable<User>
// 返回添加到數(shù)據(jù)庫的數(shù)量
@Insert
fun insertLargeNumberOfUsers(users: List<User>): Maybe<Int>
// 確保操作成功完成
@Insert
fun insertLargeNumberOfUsers(varargs users: User): Completable
//返回刪除的數(shù)量
@Delete
fun deleteAllUsers(users: List<User>): Single<Int>
}
返回的是一個類呢?
@Dao
interface MyDao {
@Query(
"SELECT user.name AS userName, pet.name AS petName " +
"FROM user, pet " +
"WHERE user.id = pet.user_id"
)
fun loadUserAndPetNames(): LiveData<List<UserPet>>
}
data class UserPet(var userName: String?, var petName: String?)