簡介
Realm 大部分代碼都是開源的届氢,但是其強(qiáng)大功能取決于隱藏在平臺內(nèi)部的一個(gè)核心數(shù)據(jù)庫引擎缠借,這個(gè)引擎完全由 C++ 編寫而成究履。
Realm 本質(zhì)上是一個(gè)嵌入式數(shù)據(jù)庫川慌,但是它也是看待數(shù)據(jù)的另一種方式亡笑。它用另一種角度來重新看待你移動應(yīng)用中的模型和業(yè)務(wù)邏輯侣夷。
Realm 最核心的理念就是對象驅(qū)動,這是 Realm 的核心原則仑乌。
簡單來說百拓,Realm有自己獨(dú)立的引擎,跟Sqlite完全不同晰甚。
Realm主要是用與數(shù)據(jù)庫關(guān)聯(lián)對象的實(shí)例來操作衙传,并且增刪改都要在事務(wù)中進(jìn)行。
例如在項(xiàng)目中有個(gè)User數(shù)據(jù)類厕九,繼承RealmObject:
User user = new User();
realm.beginTransation();
realm.copyToRealm(user);
// 對user對象的操作就是修改數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù)
realm.commitTransation();
Realm不支持主鍵自動增長
查看官方文檔蓖捶,建議創(chuàng)建對象實(shí)例,設(shè)置主鍵扁远,再copyToRealm關(guān)聯(lián)對象俊鱼。
懶加載
官方建議是寫操作不在UI線程執(zhí)行,否則有阻塞的可能畅买。
在刪除數(shù)據(jù)庫記錄時(shí)并闲,數(shù)據(jù)庫文件可能不會及時(shí)被清理,可以調(diào)用compactRealm釋放可以釋放的磁盤空間
使用(官方說明文檔)
創(chuàng)建Model
繼承RealmObject來聲明Realm數(shù)據(jù)模型
public class Shop extends RealmObject {
@PrimaryKey
private Long id;
//商品名稱
private String name;
// get/set方法
}
除了繼承RealmObject外皮获,還可以實(shí)現(xiàn)RealmModel焙蚓。使用實(shí)現(xiàn)RealmModel方式可以用RealmObject中的靜態(tài)方法來操作數(shù)據(jù)。
@RealmClass
public class User implements RealmModel {
.......
}
事務(wù)
realm所有修改操作要開啟事務(wù)(即查詢無需開啟事務(wù))洒宝,開啟事務(wù)有兩種方式
第一種是直接開啟事務(wù)购公,第二種是使用事務(wù)回調(diào)方法
// 第一種 直接開啟事務(wù)
realm.beginTransaction();
/* 數(shù)據(jù)庫操作 */
realm.commitTransaction();
// 第二種 使用事務(wù)回調(diào)方法
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
/* 數(shù)據(jù)庫操作 */
}
});
// 第二種還可以使用異步回調(diào)方法
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
/* 數(shù)據(jù)庫操作 */
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
/* 數(shù)據(jù)庫操作成功回調(diào) */
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
/* 數(shù)據(jù)庫操作失敗回調(diào) */
}
});
添加
realm添加有兩種
第一種是用realm.createObject()創(chuàng)建關(guān)聯(lián)實(shí)例對象
第二種是先創(chuàng)建對象,再用realm.copyToRealm()來關(guān)聯(lián)實(shí)例對象
public void save() {
realm.beginTransaction();
// 第一種
Shop shop1 = realm.createObject(Shop.class);
// 第二種
Shop shop2 = new Shop();
realm.copyToRealm(shop2);
realm.commitTransaction();
}
刪除
public void delete() {
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<Shop> results = realm.where(Shop.class).findAll();
Shop shop = results.get(1);
if (shop != null) {
shop.deleteFromRealm();
//RealmObject.deleteFromRealm(shop);
}
results.deleteFromRealm(1);
}
});
}
查詢
public void find() {
RealmResults<Shop> all = realm.where(Shop.class).findAll();
Shop shop = realm.where(Shop.class).equalTo("id", "1000").findFirst();
}
更新
public void update() {
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Shop shop = realm.where(Shop.class).equalTo("id", "1000").findFirst();
shop.setName("www");
}
});
}