Realm 基本用法

前提

Android Studio 1.5.1 或者更高版本;
JDK 版本 >=7;
較新的 Android SDK 版本;
支持 Android API 9 以上的所有版本(Android 2.3 Gingerbread 及以上)。

為什么使用Realm

Realm Java 讓你能夠高效地編寫 app 的模型層代碼,保證你的數(shù)據(jù)被安全、快速地存儲。

1、Realm基本配置

A.在module的build.gradle中添加如下代碼:

apply plugin: 'realm-android'

如圖所示:

1.png

B.在project的build.gradle中添加如下代碼:

 classpath "io.realm:realm-gradle-plugin:3.5.0"

如圖所示:

1.png

現(xiàn)在基本配置已經(jīng)弄好了,可以開始操作一波了。

2、數(shù)據(jù)庫基本操作(增刪改查)

在做這些操作之前我們需要新建model類(類似sqlite的新建表),這里我們需要繼承RealmObject才能被存儲在數(shù)據(jù)庫中。

public class Person extends RealmObject{
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
       this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

表已經(jīng)建好了,這時候可以對它CRUD(create/read/update/delete)了。
a.新增數(shù)據(jù)
這里需要說一下,新增數(shù)據(jù)操作需要在事務(wù)進行。如下所示:

        Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例              
        mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                //Add a person
                Person person = realm.createObject(Person.class);
                person.setId(1);
                person.setName("Young Person");
                person.setAge(14);
            }
        });

或者

 Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例   
 mRealm.beginTransaction();
 //Add a person
 Person person = realm.createObject(Person.class);
 person.setId(1);
 person.setName("Young Person");
 person.setAge(14);
 mRealm.commitTransaction();

b.查詢數(shù)據(jù)

Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例   
final Person person = mRealm.where(Person.class).findFirst();//查詢第一條數(shù)據(jù)

相關(guān)查詢API如下所示:
1?? average(String fieldName) ->返回給定字段的平均值
2?? beginGroup ->開始條件分組(“左括號”)
3?? beginsWith(String fieldName,String value) ->查詢以“value”開頭的“fieldName”
4?? between(String fieldName,float from,float to) ->查詢fieldName字段在"from"和to之間

好了,方法挺多的,這里就舉幾個例子,順便給出Realm API網(wǎng)址(https://realm.io/docs/java/3.5.0/api/)有興趣的可以去看一下。

c.更新數(shù)據(jù)

Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例   
final Person person = mRealm.where(Person.class).findFirst();//查詢第一條數(shù)據(jù)
//更新第一條數(shù)據(jù)
 mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                person.setName("Senior Person");
                person.setAge(88);
            }
        });

d.刪除數(shù)據(jù)

Realm mRealm = Realm.getDefaultInstance();//獲取Realm實例   
mRealm.executeTransaction(new Realm.Transaction() {
   @Override
    public void execute(Realm realm) {
        //清空Person表
        realm.delete(Person.class);
    }
 });

3、數(shù)據(jù)庫遷移(數(shù)據(jù)庫升級)

所有數(shù)據(jù)庫都要處理模型改變的情況。Realm 的數(shù)據(jù)模型用標準 Java 對象來定義,改變數(shù)據(jù)模型只需要改變數(shù)據(jù)對象定義即可。
Application中需要如下自定義配置:

  // Initialize Realm. Should only be done once when the application starts.
  Realm.init(this);
  RealmConfiguration myConfig=new RealmConfiguration.Builder()
                .schemaVersion(REALM_VERSION)
                .migration(new MyConfigMigration())
                .name("myrealm.realm")
                .build();
  Realm.setDefaultConfiguration(myConfig);

這時候我們需要自定義Migration

public class MyConfigMigration implements RealmMigration {
    public static final String TAG = "ez";

    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

        realmUpdate((int) oldVersion,realm);

        //官方寫法
//        if (oldVersion == 0 && newVersion == 1) {
//            version1(realm);
//            ++oldVersion;
//        }
//
//        if (oldVersion == 1 && newVersion == 2) {
//            version2(realm);
//            ++oldVersion;
//        }

    }

    /**
     * realm數(shù)據(jù)庫遷移(升級)
     * 降級:需要使用if判斷來處理
     * @param oldVersion
     * @param realm
     */
    private void realmUpdate(int oldVersion, DynamicRealm realm) {
        switch (oldVersion) {
            case 0:
                version1(realm);
            case 1:
                version2(realm);
            default:
                break;
        }
    }

    /**
     * version=1時,增加fullName,刪除name。
     * <p>
     * 注意:添加字段時,對應(yīng)的model也要對應(yīng)添加(如果標記的不為空,那么model也必須注解不為空),刪除字段時,對應(yīng)的model也要刪除,
     *
     * @param realm
     */
    private void version1(DynamicRealm realm) {
        RealmSchema schema = realm.getSchema();
        RealmObjectSchema personSchema = schema.get("Person");
        personSchema.addField("fullName", String.class, FieldAttribute.REQUIRED)
                .transform(new RealmObjectSchema.Function() {

                    @Override
                    public void apply(DynamicRealmObject obj) {
                        obj.set("fullName", obj.get("name") + "Full");
                    }
                })
                .removeField("name");
    }

    /**
     * version=2時,增加了Pet類。
     */
    private void version2(final DynamicRealm realm) {
        RealmSchema schema = realm.getSchema();
        //創(chuàng)建對應(yīng)表和表字段
        RealmObjectSchema petSchema = schema.create("Pet")
                .addField("name", String.class, FieldAttribute.REQUIRED)
                .addField("type", String.class, FieldAttribute.REQUIRED);
        //將創(chuàng)建的表添加到Person表中
        schema.get("Person")
                .addRealmListField("pets", petSchema)
                .transform(new RealmObjectSchema.Function() {
                    @Override
                    public void apply(DynamicRealmObject obj) {
                        if (obj.getString("fullName").equals("Senior PersonFull")) {
                            DynamicRealmObject pet = realm.createObject("Pet");
                            pet.setString("name", "Jemos");
                            pet.setString("type", "cat");
                            obj.getList("pets").add(pet);
                        }
                    }
                });
    }
}

當我們每次增加schemaVersion的值時,數(shù)據(jù)庫就會走升級操作。
好了,上面就是Realm的基本用法。詳細用法請參考官網(wǎng):
a、中文版(版本3.1.1)https://realm.io/cn/docs/java/latest/#migrations
b、英文版(版本3.5.0)https://realm.io/docs/java/latest/
c、官方Realm使用Demo https://github.com/realm/realm-java

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,057評論 25 709
  • Realm是由Y Combinator公司孵化出來的一款可以用于iOS(同樣適用于Swift&Objective-...
    小歪子go閱讀 2,378評論 6 9
  • 煩躁…誰知道這傢伙坐我旁邊陷入自己播放的音樂中無法自拔是鬧哪樣!首先,不喜歡他播放的品種,欣賞不了,愛來愛去的...
    宋小朝閱讀 247評論 0 1
  • 一 東 云對雨,雪對風,晚照對晴空。來鴻對去燕,宿鳥對鳴蟲。三尺劍,六鈞弓,嶺北對江東。人間清暑殿,天上廣寒宮。兩...
    淡然雨閱讀 317評論 3 1

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