天天看點

Android room 相容版本,Android ROOM的基本使用

簡介

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寫法