Android 18章:Realm-in-android

10959 ワード

Realmの紹介
  • Realm公式サイトリンクhttps://realm.io/
  • オープンソースアドレスhttps://github.com/realm/realm-java
  • 公式使用文書https://realm.io/docs/java/latest/

  • RealmはオープンソースのORMコンセプトの(オブジェクト関係マッピング)モバイルデータベースであり、Android、ios、javaの各プラットフォームで使用でき、性能秒殺sqliteなどのデータベース(greendao)などがある.
    クイックスタート
    たった2歩
    プロジェクト全体のbuild.gradleにdependenciesとしてclasspath「io.realm:realm-gradle-plugin:2.3.1」と入力します.ここでは二重引用符を使用します.ここは二重引用符でお願いします.ここは二重引用符でお願いします.
    buildscript {
        repositories {
    
            jcenter()
    
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.2.3'
            classpath "io.realm:realm-gradle-plugin:2.3.1"
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    

    appのbulid.gradleにapply plugin:'alm-android'を入力
    apply plugin: 'com.android.application'
    apply plugin: 'realm-android'
    

    ★以上の操作でrealmのasでの構成が完了しました.
    Realmのモデル
    カスタムクラスRealmObjectを継承するには、パラメータ付き構築メソッドを再ロードする場合は、パラメータなしの構築メソッドを複数書く必要があります.そうしないとjavacの例外が放出されます.なぜか聞かないでください.
    public class Dog extends RealmObject {
        private String name;
        private int age;
    
        public Dog() {
    
        }
    
        public Dog(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        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;
        }
    }
    

    クラスAに他のクラスの集合が含まれている場合はResultList、例えば
    public class Person extends RealmObject {
        @PrimaryKey
        private long id;
        private String name;
        private RealmList mDogRealmList;
        }
    

    カスタムクラスが他の親クラスを継承している場合は、RealmModelを実装してrealmオブジェクトモデルを構築することもできます.
    @RealmClass
    public class User implements RealmModel {
    
        private String name;
        private int id;
        //...
    }
    

    Realm注記の説明
    @RealmClass RealmModelインタフェースを実装するクラスにこの注記を追加します.
    @Required修飾は空のメンバー変数にはできません
    @Ignore修飾データベースに書き込まない変数
    @PrimaryKeyこのメンバー変数をクラスのプライマリ・キーとして設定
    @Indexはクエリーの速度を速めますが、データの挿入が遅くなります
    Realm初期化
    カスタムアプリケーションでRealm.init(this);
    Realmインスタンスの取得
    realm = Realm.getDefaultInstance();
    

    これはデフォルトの構成を取得するRealmです.デフォルトはdata/data/packageName/files/default.realmに保存されます.RealmConfigurationをカスタマイズすることもできます.通常はカスタムファイル名、暗号化キー、データベースバージョン番号、マージ前のデータを削除するかどうかなどです.Realmはcloseableインタフェースを実装しているので、getInstanceのたびに、最後に閉じるまでcloseメソッドを呼び出します.例えばactivityのondestroyでrealm.close()を呼び出す.
    Realm書き込み
    RealmはMVCCアーキテクチャで、同じスレッドの読み書き操作はデータの取得に影響しませんが、マルチスレッドの読み書き操作はトランザクションに使用され、データの取得の一貫性とスレッドの安全性を確保します.トランザクションtranscationに入れて実行し、トランザクション全体のオペレーションがコミットされるか、またはすべてのキャンセルオペレーションがrealm.cancelTranscation()を呼び出すことを確認します.データの一貫性を確保します.
    realm = Realm.getDefaultInstance();
    realm.beginTransaction();
    Dog d=new Dog("a",1);
    Dog b=realm.copyToRealm(d);//   copyToRealm         d  。    d       。
    b.setName("b");
    realm.commitTransaction(); //          dog  b 
    

    ♥copyToRealmは、データベースに変数をコピーしてプライマリ・キーを含めます.プライマリ・キーが重複すると例外が放出され、コピー後にプライマリ・キーは変更できません.
    2つのスレッドが同時に書き込まれると、もう1つはプライマリ・スレッドがブロックされるため、非同期トランザクションを呼び出してプライマリ・スレッドのブロックを回避します.
    //      
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            Dog dog = realm.copyToRealm(new Dog(1, "2", 3));
            dog.setName("pp");
        }
    });
    
    //       
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            Dog dog = realm.copyToRealm(dogOne);
            dog.setName("apple");
    
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            RealmResults list = realm.where(Dog.class).findAll();
            for (int i = 0; i < list.size(); i++) {
                Log.i(TAG, "onSuccess: " + list.toString());
            }
        }
    });
    

    realmのプライマリ・キーは、oncreateメソッドにプライマリ・キーを設定するRealmObjectメソッドを追加し、次回のoncreate呼び出しでプライマリ・キーがexistかどうかを判断せずにデータベースに追加するとエラーが発生します.一方、oncreateメソッドにプライマリ・キーが設定されていないrealmobjectクラスが追加されていない場合、次回oncreateメソッドを呼び出すと、自己起動データベース・ファイルに追加されます.
    Realmクエリ
    クエリーは、次のクエリー条件をサポートするRealmResultsオブジェクトを返します.
  • between()、greaterThan()、lessThan()、greaterThanOrEqualTo()およびlessThanOrEqualTo()
  • equalTo()およびnotEqualTo()
  • contains()、beginsWith()およびendsWith()
  • isNull()およびisNotNull()
  • isEmpty()およびisNotEmpty()
  • RealmResults list=realm.where(Dog.class).lessThan("age",1).findAll();
    for (int i = 0; i < list.size(); i++) {
        Log.i(TAG, "execute: "+list.get(i).getName());
    }
    

    Realm修正
    変更操作は1つのトランザクションで完了します.
      dog = new Dog(1, "a", 1);
            realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    dog = realm.copyToRealm(dog);
                    dog.setAge(2);
                    dog.setName("kiki");
    
    
                    RealmResults list = realm.where(Dog.class).equalTo("id", 1).findAll();
                    list.get(0).setName("ab");
    
    
                   
                }
            });
    
    

    RealmResultのchangeListener
    RealmResultコンテンツの変更を監視します.
    RealmResults list = realm.where(Dog.class).lessThan("id", 3).findAll();
    
    
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
    
            Dog dog = realm.createObject(Dog.class);
            dog.setId(2);
            dog.setName("aaaa");
            dog.setAge(3);
    
    
        }
    });
    list.addChangeListener(new RealmChangeListener>() {
        @Override
        public void onChange(RealmResults element) {
            Log.i(TAG, "onChange: " + element.toString());
        }
    });
    
    //     activity  fragment       ondestory  
    list.removeChangeListeners();//     listener
    list。removeChangeListener(callback);//    callback
    

    Realmの削除
    上記の例のクエリidが3未満のrealmresultセットを続行
    list.addChangeListener(new RealmChangeListener>() {
        @Override
        public void onChange(RealmResults element) {
            element.deleteFirstFromRealm();//       
            element.deleteAllFromRealm();//      
            element.deleteFromRealm(0);//      
            element.deleteLastFromRealm();//        
            element.get(1).deleteFromRealm();//    obejct
        }
    });
    

    Realm json文字列を追加
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.createObjectFromJson(Dog.class,"{
    " + " \"id\": 1,
    " + " \"name\": \"bili\",
    " + " \"age\": 12
    " + "}"); } });

    copyFromRealm,copyToRealmとcreateObjectの違い
  • copyFromRealmは、realmデータベース内の変数をコピーし、すべてのプロパティをコピーするRealmObjectに送信されます.
  • copyToRealmは、このObjectのすべての属性をrealmデータベースの
  • にコピーするObjectに転送します.
  • createObjectはclassを入力し、そのメンバー変数をデフォルト値nullに割り当てるか、
  • を後期に割り当てる必要があります.
    RealmResult使用
    RealmResults list = realm.where(Dog.class).findAll();
      list.sum("age");
      list.max("age");
      list.min("age");
      list.average("age");
    

    例えばdogクラスのすべてのオブジェクトを取得して、ageの総和を求めて、最大値、最小値、平均値
    DynamicRealm
    DynamicRealmはRealmの変種であり、RealmObjectを継承していないクラスを操作することができ、操作クラスは、もちろんRealmObjectではなく文字列の形式で操作され、彼のデフォルト構成はschemaバージョン番号、migrationマージ情報のチェックを少なくした.
         DynamicRealm dynamicRealm = DynamicRealm.getInstance(new RealmConfiguration.Builder().build());
          dynamicRealm.executeTransaction(new DynamicRealm.Transaction() {
              @Override
              public void execute(DynamicRealm realm) {
                  DynamicRealmObject person = realm.createObject("Person",1);
                  person.setString("name", "kik");
                  
              }
          });
    
    

    Realmのclose
    Realmはcloseableインタフェースを実装しているので、getInstanceのたびに、最後に閉じるまでcloseメソッドを呼び出します.例えばactivityのondestroyでrealm.close()を呼び出す.
    たとえば、サブスレッドgetInstanceでは、サブスレッドが終了する前にclose()を呼び出す必要があります.
    class MyRunnable implements Runnable{
    
        @Override
        public void run() {
            try {
                Realm realm=Realm.getDefaultInstance();
            
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                realm.close();
    
            }
        }
    }
    

    Realmバージョンの移行
    realmバージョンが1の場合、realmバージョンをアップグレードするのは2で、データの解釈が変更されました.たとえば、RealmObejctのメンバー変数が追加された場合、default.realmに古いデータがある場合、アップグレードに失敗します.migrationマージルールを設定する必要があります.
    RealmConfiguration変数をカスタマイズするには、migrateメソッドを書き換えてoldVersionが前のバージョン番号であることを判断し、どのようなニーズを行うかを判断します.
    //         
    addField("key",long.class);//       key
    removeField("key");//        key
    addRealmListField("dogs",schema.get("Dog"));//  Realmlist  dogs
    addRealmObjectField("dog",schema.get("Dog"));//  realmobject  dog
    transform(new RealmObjectSchema.Function(){
      public void apply(DynamicRealmObject obj){
        obj.set("fullname",obj.getString("firstName")+" "+obj.getString("lastName"))
      }
    });// firstname lastname   fullname
    

    例えばバージョンアップにkeyを加える
    
        RealmMigration mRealmMigration=new RealmMigration() {
            @Override
            public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
                RealmSchema schema=realm.getSchema();
     /*
               //version 0
               class Dog
    
                private long id;
                private String name;
                private int age;
    
                  //version 1
               class Dog
                private long key;
                private long id;
                private String name;
                private int age;
    
                */
    
    
    
                //version 0 to version 1
                if(oldVersion==1){
                    schema.get("Dog")
                            .addField("key",long.class);
                           /* .addRealmObjectField("dogs",schema.get("Dog"))
                            .addRealmObjectField("dog",schema.get("Dog"));*/
                    oldVersion++;
                }
            }
        };
    
    
      //  
      realm = Realm.getInstance(PPApplicaion.mMigrationConfiguration);
    

    まとめ
  • Realmでは、トランザクションに合わせてデータを変更する場合が多い.
  • Realmは、1つのRealmObjectを1つのテーブルとして機能する.
  • realmのgetInstanceとcloseはペアを組んで
  • を使用します.
  • RealmResult削除listener
  • に注意