簡介
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注解的類應該需要滿足以下條件
在注釋中包含資料庫相關聯的實體清單
在包含具有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?
@Query("SELECT * FROM user WHERE 'uid' IN (:userIds)")
fun loadAllByIds(userIds: IntArray?): List?
// @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 getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List 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寫法