Android數(shù)據(jù)庫(kù)---Realm

簡(jiǎn)介

Realm 大部分代碼都是開(kāi)源的,但是其強(qiáng)大功能取決于隱藏在平臺(tái)內(nèi)部的一個(gè)核心數(shù)據(jù)庫(kù)引擎,這個(gè)引擎完全由 C++ 編寫(xiě)而成。

Realm 本質(zhì)上是一個(gè)嵌入式數(shù)據(jù)庫(kù),但是它也是看待數(shù)據(jù)的另一種方式。它用另一種角度來(lái)重新看待你移動(dòng)應(yīng)用中的模型和業(yè)務(wù)邏輯。

Realm 最核心的理念就是對(duì)象驅(qū)動(dòng),這是 Realm 的核心原則。

簡(jiǎn)單來(lái)說(shuō),Realm有自己獨(dú)立的引擎,跟Sqlite完全不同。
Realm主要是用與數(shù)據(jù)庫(kù)關(guān)聯(lián)對(duì)象的實(shí)例來(lái)操作,并且增刪改都要在事務(wù)中進(jìn)行。
例如在項(xiàng)目中有個(gè)User數(shù)據(jù)類,繼承RealmObject:

User user = new User();
realm.beginTransation();
realm.copyToRealm(user);
// 對(duì)user對(duì)象的操作就是修改數(shù)據(jù)庫(kù)中對(duì)應(yīng)的數(shù)據(jù)
realm.commitTransation();

Realm不支持主鍵自動(dòng)增長(zhǎng)


image.png

image.png

查看官方文檔,建議創(chuàng)建對(duì)象實(shí)例,設(shè)置主鍵,再copyToRealm關(guān)聯(lián)對(duì)象。

懶加載


image.png

官方建議是寫(xiě)操作不在UI線程執(zhí)行,否則有阻塞的可能。


image.png

在刪除數(shù)據(jù)庫(kù)記錄時(shí),數(shù)據(jù)庫(kù)文件可能不會(huì)及時(shí)被清理,可以調(diào)用compactRealm釋放可以釋放的磁盤(pán)空間


image.png

使用(官方說(shuō)明文檔)

創(chuàng)建Model

繼承RealmObject來(lái)聲明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)方法來(lái)操作數(shù)據(jù)。

@RealmClass 
public class User implements RealmModel {
    .......
}

事務(wù)

realm所有修改操作要開(kāi)啟事務(wù)(即查詢無(wú)需開(kāi)啟事務(wù)),開(kāi)啟事務(wù)有兩種方式
第一種是直接開(kāi)啟事務(wù),第二種是使用事務(wù)回調(diào)方法

// 第一種 直接開(kāi)啟事務(wù)
realm.beginTransaction();
/* 數(shù)據(jù)庫(kù)操作 */
realm.commitTransaction();

// 第二種 使用事務(wù)回調(diào)方法
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        /* 數(shù)據(jù)庫(kù)操作 */
    }
});
// 第二種還可以使用異步回調(diào)方法
realm.executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        /* 數(shù)據(jù)庫(kù)操作 */
    }
}, new Realm.Transaction.OnSuccess() {
    @Override
    public void onSuccess() {
        /* 數(shù)據(jù)庫(kù)操作成功回調(diào) */
    }
}, new Realm.Transaction.OnError() {
    @Override
    public void onError(Throwable error) {
        /* 數(shù)據(jù)庫(kù)操作失敗回調(diào) */
    }
});

添加

realm添加有兩種
第一種是用realm.createObject()創(chuàng)建關(guān)聯(lián)實(shí)例對(duì)象
第二種是先創(chuàng)建對(duì)象,再用realm.copyToRealm()來(lái)關(guān)聯(lián)實(shí)例對(duì)象

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");
        }
    });
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容