一、前言
在我正式接觸到Android數據庫orm框架的時候,我有把github上的所有優秀的orm數據庫項目都擼了一遍,保留了幾個自己感興趣並且適用於現在的項目中,這些框架中,有些在我前兩篇博文中已經提到過,但是今天厲害了,我要介紹一個文件式數據庫——Realm,一個簡便的數據庫。
二、Realm的簡介
移動端的數據庫,適用於 Phone、Tablet、Wearable,支持 ORM,線程安全、支持連表及數據庫加密,比 SQLite 性能更好
項目地址:https://github.com/realm/realm-java
文檔介紹:http://realm.io/docs/java/0.72.0/
如果你比較關心Android開發的最新動態的話,那麼你肯定會聽說過Realm,Realm是一個輕量級的數據庫,在Android開發中,它可以替代SQLite和ORM框架。Realm是一款開源的數據庫工具,它具有快速,易於使用和支持多平臺的特點.它完全可以取代我們Android中的SQLite數據庫,它比SQLite使用起來更加的方便快捷.
和SQLite相比,Realm速度更快並且它有很多先進的特性,例如對JSON的支持,流暢的API,數據變化通知(觀察者),加密支持…,最令人感動的當然屬於它詳細的文檔Realm文檔 ,感興趣的可以點擊閱讀。
二、Realm的使用
(一)將Realm添加到項目
想在Android的項目當中使用Realm,只需在依賴文件app/build.gradle下的dependencies節點添加依賴即可。
compile 'io.realm:realm-android:0.84.1'
(二)創建Realm對象
Realm和Sqlite類似,都是以文件數據庫的方式而存在,一個Realm相當於一個SQLite數據庫。它有一個與之對應的文件,一旦創建將持久保存在安卓的文件系統中。要創建一個新的Realm,你可以在任意Activity中調用靜態方法Realm.getInstance。
Realm myRealm = Realm.getInstance(context);
通過Realm.getInstance()
方法可以得到一個Realm對象,同時也會在Android文件系統中創建一個名爲default.realm
的Realm文件.我們還可以通過RealmConfiguration.Builder
對象來創建自己命名的Realm對象。
Realm myOtherRealm =
Realm.getInstance(new RealmConfiguration.Builder(context)
.name("myRealm.realm")
.build()
);
(三)創建RealmObject
如果一個javabean繼承了RealmObject,那麼它就可以用來存儲Realm。
public class Dog extends RealmObject {
private String name;
private int age;
// ... 構造方法和getter(),setter()方法 ...
}
還可以爲對象屬性指定primary key
public class Person extends RealmObject {
@PrimaryKey
private long id;
private String name;
// ... Generated getters and setters ...
}
(四)對RealmObject進行操作
要將數據存儲到Realm上就需要進行事務操作,雖然從一個Realm讀取數據非常簡單(下一節有講),但是向它寫入數據就稍微複雜一點。Realm遵循 ACID
(數據庫事務正確執行的四個基本要素的縮寫)規範,爲了確保原子性和一致性,它強制所有的寫入操作都在一個事務中執行。要開始一個新的事務,使用beginTransaction
方法。類似地,要結束這個事務,使用commitTransaction
方法。
下面是一個簡單的例子:
myRealm.beginTransaction();
// Create an object
Dog dog1 = myRealm.createObject(Dog.class);
// Set its fields
dog1.setName("Rose");
dog1.setAge(7);
myRealm.commitTransaction();
通過Realm的createObject()
方法創建的對象,並不是通過它的構造函數創建的.這是爲了讓Realm可以管理RealmObject
的實例。如果你想通過構造函數創建對象,最後別忘了使用Realm的copyToRealm()
方法將對象與RealmObject
關聯。
Dog dog2 = new Dog();
dog2.setName("Lily");
dog2.setAge(4);
myRealm.beginTransaction();
Dog copyOfDog = myRealm.copyToRealm(dog2);
myRealm.commitTransaction();
Realm的查詢操作就簡單多了,通過使用where()方法關聯相應的
Realm提供了一套非常直觀簡單的API用來查詢操作,調用Realm的where方法,並且將你需要的類的class傳遞進去, 你就完成了一個查詢的創建,之後, 你可以調用findAll方法來遍歷所有的數據,返回的數據保存在RealmResults對象中。
RealmResults<Dog> results1 =
myRealm.where(Dog.class).findAll();
for(Dog d:results1) {
Log.d("results1", d.getName());
}
// Prints Jack, Mike
除此之外, 你還可以使用beginsWith
,endsWith
,lesserThan
和greaterThan
方法來過濾結果,若想得到age小於4的Dog對象,我們可以這樣操作
RealmResults<Dog> results2 =
myRealm.where(Dog.class)
.lesserThan("age", 4)
.findAll();
// 得到 Mike
如果你想讓查詢結果按照某個順序來,你可以使用findAllSorted方法,它有一個String類型的參數和一個boolean類型的參數,其中,String指定用來排序的字段,boolean指定了排序方式。
RealmResults<Dog> results3 =
myRealm.where(Dog.class)
.findAllSorted("name", false);
(五)事務操作
第一種方式:
realm.beginTransaction();
realm.copyToRealm(dog);
realm.commitTransaction();
第二種方式(異步線程執行):
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Dog theDog = realm.where(Dog.class).equals("age", 1).findFirst();
theDog.setAge(3);
}
}, new Realm.Transaction.Callback() {
@Override
public void onSuccess() {
//自動更新原始數據
dog.getAge();
}
});
四、總結
Realm確實是一個非常前沿的數據庫框架,跟其它ORM的千篇一律不同,它提供了強大的功能和可靠的速度,它的優點可以作如下總結:
效率高,因爲是自己實現的C++數據庫,與SQLite底層使用java不同,它天生就比其高效快速。維護Realm數據庫還能帶來平臺無關性,iOS、Android等平臺都可以共享數據庫。
Auto-Refresh,Realm爲每個實體創建了代理類,並且實現了其Getter/Setter,因此,每次得到或者修改實體的值,都是直接對底層數據庫進行的操作,官方將其稱爲”懶加載”。
寫到這裏,關於框架介紹已經圍繞greenDao、OrmLite、Realm展開,前兩個可以回溯看我的其他博文,最後一篇將會以一個之前很火的orm框架結尾,並且在這幾個框架之間做最後對比,盡情期待…