Android 數據庫DataBase realm基礎使用

前言:

Android開發中,不可避免使用到數據庫來記錄必要數據,比如手機寫教程存草稿,臨時的標題、圖片Uri、描述等寫在數據庫中,方便下次編輯,比如一些遠程實時觀測大數據,不能實時傳送,需要蒐集到設備中DataBase,後續通過服務保證上傳完整性,或者一些離線操作app都需要大量的DataBase。

DataBase選取,GreenDao、realm等專門爲移動端設計的數據庫DataBase,至於性能各有優勢,但是還是主流讓我選擇了realm,原因很簡單,就是因爲使用簡單。

地址:

realm官網:https://realm.io/cn/docs/java/latest/#快速入門

realm git:https://github.com/realm/realm-java

真心建議看官網文檔,git寫的有點潦草。

集成:

AndroidStudio集成,由於不同版本集成不一樣,請按照官網最新的集成文檔來做:https://realm.io/cn/docs/java/latest/#安裝

使用:

1、模式,realm整體採用單例模式,所以一次數據庫操作,都是在一個線程中進行的,不可誇線程的讀取操作數據,所以在使用時候儘量使用異步操作(儘管realm提供了同步和異步兩種),這樣對Androidx會很友好。

2、增刪改查,一下增刪改查都是建立在異步操作基礎上。

3、Bean,realm操作的所有數據,都是你簡歷的Bean基本對象:

至於一些特殊的處理,比如不想某個字段被存儲,則必須使用標籤,標籤使用參考官網文檔。

/**
 * Course數據庫
 *
 * 存儲本地編輯中的Course數據
 * 採用realm
 *
 * 只存一條編輯中,提交以後清空此表,有多條也同時刪除
 */
public class Course extends RealmObject {
    private String id; //唯一id(因爲只能有一條數據,所以固定爲CourseEditCurrent)
    private String title;//標題
    private String coverUriPath;//封面uriPath
    private String story;//故事
    private String sort;//分類

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getCoverUriPath() {
        return coverUriPath;
    }

    public void setCoverUriPath(String coverUriPath) {
        this.coverUriPath = coverUriPath;
    }

    public String getStory() {
        return story;
    }

    public void setStory(String story) {
        this.story = story;
    }

    public String getSort() {
        return sort;
    }

    public void setSort(String sort) {
        this.sort = sort;
    }
}

4、先初始化,後使用增刪改查:

Realm.init(MainActivity.this);//初始化realm DataBase

5、增:

                //創建本地Course DataBase
                Realm.getDefaultInstance().executeTransactionAsync(new Realm.Transaction() {
                    @Override
                    public void execute(Realm bgRealm) {
                        Course course = bgRealm.createObject(Course.class);
                        course.setId(StaticUtil.DATA_BASE_COURSE_CURRENT_ID);
                        course.setTitle(et_title.getText().toString().trim());
                    }
                }, new Realm.Transaction.OnSuccess() {
                    @Override
                    public void onSuccess() {
                        // Transaction was a success.

                        gotoNext();
                    }
                }, new Realm.Transaction.OnError() {
                    @Override
                    public void onError(Throwable error) {
                        // Transaction failed and was automatically canceled.
                        UiUtil.showToast(CourseNewOneActivity.this, "本地存儲失敗");
                    }
                });

6、查詢和刪出:

        //查詢滿足條件的
        final Realm realm = Realm.getDefaultInstance();
        courseDataBaseResults = realm.where(Course.class)
                .equalTo("id", StaticUtil.DATA_BASE_COURSE_CURRENT_ID)
                .findAll();

        LogUtil.d("DataBase", "Course result size:" + courseDataBaseResults.size());

        //刪除必須在一個executeTransaction中執行
        realm.executeTransaction(new Realm.Transaction() {
               @Override
               public void execute(Realm realm) {
                    //刪除單個參考官網
                    courseDataBaseResults.deleteAllFromRealm();//刪除所有的
                    LogUtil.d("DataBase", "Course delete size:" + courseDataBaseResults.size());
                    }
                });
        }

7、改:

更新某個字段,或者增加一個字段比較特殊,由於realm使用的規則是實時同步規則,即設置值以後,不需要其它操作,數據庫已經是最新數據了,十分方便(記得要在executeTransactionAsync中操作)。

        Realm.getDefaultInstance().executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm bgRealm) {
                Course course = bgRealm.where(Course.class).equalTo("id", StaticUtil.DATA_BASE_COURSE_CURRENT_ID).findFirst();
                course.setCoverUriPath(uriPath);
            }
        });

注意:

1、realm採用的是Bean對象操作數據,如果你的Bean對象中增加字段或者刪除字段,以及把Title改成name,name初始化數據庫就會報錯,修改方法是把app刪除重新安裝,不過這樣會造成本地數據丟失,切記謹慎操作,或者去數據庫修改字段。

2、由於是單例模式,所以在executeTransactionAsync裏面的操作,一定要用回調的Realm bgRealm,否則會報錯不在一個線程中操作數據:
                //創建本地Course DataBase
                Realm.getDefaultInstance().executeTransactionAsync(new Realm.Transaction() {
                    @Override
                    public void execute(Realm bgRealm) {
                        Course course = bgRealm.createObject(Course.class);
                        course.setId(StaticUtil.DATA_BASE_COURSE_CURRENT_ID);
                        course.setTitle(et_title.getText().toString().trim());
                    }
                },

3、使用單例操作Realm.getDefaultInstance()數據庫之前一定要初始化,只用初始化一次即可Realm.init(MainActivity.this);//初始化realm DataBase。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章