前言:
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。