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」と入力します.ここでは二重引用符を使用します.ここは二重引用符でお願いします.ここは二重引用符でお願いします.
appのbulid.gradleにapply plugin:'alm-android'を入力
★以上の操作でrealmのasでの構成が完了しました.
Realmのモデル
カスタムクラスRealmObjectを継承するには、パラメータ付き構築メソッドを再ロードする場合は、パラメータなしの構築メソッドを複数書く必要があります.そうしないとjavacの例外が放出されます.なぜか聞かないでください.
クラスAに他のクラスの集合が含まれている場合はResultList、例えば
カスタムクラスが他の親クラスを継承している場合は、RealmModelを実装してrealmオブジェクトモデルを構築することもできます.
Realm注記の説明
@RealmClass RealmModelインタフェースを実装するクラスにこの注記を追加します.
@Required修飾は空のメンバー変数にはできません
@Ignore修飾データベースに書き込まない変数
@PrimaryKeyこのメンバー変数をクラスのプライマリ・キーとして設定
@Indexはクエリーの速度を速めますが、データの挿入が遅くなります
Realm初期化
カスタムアプリケーションでRealm.init(this);
Realmインスタンスの取得
これはデフォルトの構成を取得するRealmです.デフォルトはdata/data/packageName/files/default.realmに保存されます.RealmConfigurationをカスタマイズすることもできます.通常はカスタムファイル名、暗号化キー、データベースバージョン番号、マージ前のデータを削除するかどうかなどです.Realmはcloseableインタフェースを実装しているので、getInstanceのたびに、最後に閉じるまでcloseメソッドを呼び出します.例えばactivityのondestroyでrealm.close()を呼び出す.
Realm書き込み
RealmはMVCCアーキテクチャで、同じスレッドの読み書き操作はデータの取得に影響しませんが、マルチスレッドの読み書き操作はトランザクションに使用され、データの取得の一貫性とスレッドの安全性を確保します.トランザクションtranscationに入れて実行し、トランザクション全体のオペレーションがコミットされるか、またはすべてのキャンセルオペレーションがrealm.cancelTranscation()を呼び出すことを確認します.データの一貫性を確保します.
♥copyToRealmは、データベースに変数をコピーしてプライマリ・キーを含めます.プライマリ・キーが重複すると例外が放出され、コピー後にプライマリ・キーは変更できません.
2つのスレッドが同時に書き込まれると、もう1つはプライマリ・スレッドがブロックされるため、非同期トランザクションを呼び出してプライマリ・スレッドのブロックを回避します.
realmのプライマリ・キーは、oncreateメソッドにプライマリ・キーを設定するRealmObjectメソッドを追加し、次回のoncreate呼び出しでプライマリ・キーがexistかどうかを判断せずにデータベースに追加するとエラーが発生します.一方、oncreateメソッドにプライマリ・キーが設定されていないrealmobjectクラスが追加されていない場合、次回oncreateメソッドを呼び出すと、自己起動データベース・ファイルに追加されます.
Realmクエリ
クエリーは、次のクエリー条件をサポートするRealmResultsオブジェクトを返します. between()、greaterThan()、lessThan()、greaterThanOrEqualTo()およびlessThanOrEqualTo() equalTo()およびnotEqualTo() contains()、beginsWith()およびendsWith() isNull()およびisNotNull() isEmpty()およびisNotEmpty()
Realm修正
変更操作は1つのトランザクションで完了します.
RealmResultのchangeListener
RealmResultコンテンツの変更を監視します.
Realmの削除
上記の例のクエリidが3未満のrealmresultセットを続行
Realm json文字列を追加
copyFromRealm,copyToRealmとcreateObjectの違い copyFromRealmは、realmデータベース内の変数をコピーし、すべてのプロパティをコピーするRealmObjectに送信されます. copyToRealmは、このObjectのすべての属性をrealmデータベースの にコピーするObjectに転送します. createObjectはclassを入力し、そのメンバー変数をデフォルト値nullに割り当てるか、 を後期に割り当てる必要があります.
RealmResult使用
例えばdogクラスのすべてのオブジェクトを取得して、ageの総和を求めて、最大値、最小値、平均値
DynamicRealm
DynamicRealmはRealmの変種であり、RealmObjectを継承していないクラスを操作することができ、操作クラスは、もちろんRealmObjectではなく文字列の形式で操作され、彼のデフォルト構成はschemaバージョン番号、migrationマージ情報のチェックを少なくした.
Realmのclose
Realmはcloseableインタフェースを実装しているので、getInstanceのたびに、最後に閉じるまでcloseメソッドを呼び出します.例えばactivityのondestroyでrealm.close()を呼び出す.
たとえば、サブスレッドgetInstanceでは、サブスレッドが終了する前にclose()を呼び出す必要があります.
Realmバージョンの移行
realmバージョンが1の場合、realmバージョンをアップグレードするのは2で、データの解釈が変更されました.たとえば、RealmObejctのメンバー変数が追加された場合、default.realmに古いデータがある場合、アップグレードに失敗します.migrationマージルールを設定する必要があります.
RealmConfiguration変数をカスタマイズするには、migrateメソッドを書き換えてoldVersionが前のバージョン番号であることを判断し、どのようなニーズを行うかを判断します.
例えばバージョンアップにkeyを加える
まとめ Realmでは、トランザクションに合わせてデータを変更する場合が多い. Realmは、1つのRealmObjectを1つのテーブルとして機能する. realmのgetInstanceとcloseはペアを組んで を使用します. RealmResult削除listener に注意
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オブジェクトを返します.
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の違い
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);
まとめ