簡介
Room持久庫提供了一個SQLite抽象層,讓你訪問數據庫更加穩如狗,提示數據庫性能。
Room庫幫助應用數據緩存,這個緩存是應用唯一的真實來源,并且允許用戶查看應用中的關鍵信息的一致副本。
導入庫
dependencies {
def room_version = "1.1.1"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version" // use kapt for Kotlin
// optional - RxJava support for Room
implementation "android.arch.persistence.room:rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "android.arch.persistence.room:guava:$room_version"
// Test helpers
testImplementation "android.arch.persistence.room:testing:$room_version"
}
在Androidx版本下
dependencies {
def room_version = "2.0.0-beta01"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
ROOM的三個重要組件
Database具體可看官網,用@Database注解的類應該需要滿足以下條件
- 一個繼承RoomDatabase的抽象類
- 在注釋中包含數據庫相關聯的實體列表
- 在包含具有0個參數的抽象方法,并返回用@Dao
在運行時,可以通過調用Room.databaseBuild()或者Room.inMemoryDatabaseBuild()
獲取數據庫實例
Entity:表示數據庫內的表
Dao:包含用于訪問數據庫的方法。
這些組件,以及它們與程序的其余部分的關系可自尋在網上找圖圖解.
下面代碼示例包含了entity與dao數據的配置
kotlin寫法
@Entity
data class User(
var userName: String,
var passWord: String
) {
@PrimaryKey
var id = 0
}
Java寫法,參考
@Entity
public class User {
@PrimaryKey
private int uid;
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "last_name")
private String lastName;
// Getters and setters are ignored for brevity,
// but they're required for Room to work.
}
userDao.kt
@Dao
interface UserDao {
//查詢user表中所有數據
@get:Query("SELECT * FROM user")
val all: List<User?>?
@Query("SELECT * FROM user WHERE 'uid' IN (:userIds)")
fun loadAllByIds(userIds: IntArray?): List<User?>?
// @Query("SELECT * FROM user LIMIT 1")
// void findUser(User user);
@Query("SELECT * FROM User LIMIT 1")
fun findUser(): User?
@Insert
fun insertAll(users: User?)
@Delete
fun delete(vararg users: User?)
@Query("DELETE FROM User")
fun deleteAllUser()
}
userDao.java
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND "
+ "last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
AppDatabase .kt
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao?
}
AppDatabase.java
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
在創建上面的文件之后,使用以下代碼獲得創建數據庫的實例:
kotlin
var db: AppDatabase? = null
db = Room.databaseBuilder(applicationContext,
AppDatabase::class.java, "database-name")
.allowMainThreadQueries() //允許在主線程中查詢
.build()
java
AppDatabase db;
db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name")
.allowMainThreadQueries()//允許在主線程中查詢
.build();
注意:在實例化AppDatabase對象時,應遵循單例設計模式,因為每個Roomdatabase實例都相當消耗性能,并且您很少需要訪問多個實例。
參考文章:https://blog.csdn.net/u011897062/article/details/82107709本人增加了kontlin寫法