關於Android數據庫orm工具庫對比的幾點思考(三)

一、前言

在我正式接觸到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

除此之外, 你還可以使用beginsWithendsWithlesserThangreaterThan方法來過濾結果,若想得到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的千篇一律不同,它提供了強大的功能和可靠的速度,它的優點可以作如下總結:

  1. 效率高,因爲是自己實現的C++數據庫,與SQLite底層使用java不同,它天生就比其高效快速。維護Realm數據庫還能帶來平臺無關性,iOS、Android等平臺都可以共享數據庫。

  2. Auto-Refresh,Realm爲每個實體創建了代理類,並且實現了其Getter/Setter,因此,每次得到或者修改實體的值,都是直接對底層數據庫進行的操作,官方將其稱爲”懶加載”。

    寫到這裏,關於框架介紹已經圍繞greenDao、OrmLite、Realm展開,前兩個可以回溯看我的其他博文,最後一篇將會以一個之前很火的orm框架結尾,並且在這幾個框架之間做最後對比,盡情期待…

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