文書を使用して、レルム(Java)のデータベース(ディレクトリ)
継承によってRealmObject
モデルのレルムの基本クラスを作成します。
public class User extends RealmObject {
private String name;
private int age;
@Ignore
private int sessionId;
// IDE生成的标准getters和setters…
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; }
public int getSessionId() { return sessionId; }
public void setSessionId(int sessionId) { this.sessionId = sessionId; }
}
レルムモデルフィールドは、パブリック、保護およびプライベート修飾子とカスタムメソッドをサポートしています。
public class User extends RealmObject {
public String name;
public boolean hasLongName() {
return name.length() > 7;
}
@Override
public boolean equals(Object o) {
// Custom equals comparison
}
}
3.1フィールドタイプ
レルムのサポートboolean、byte、short、int、long、float、double、String、Date
とbyte[]
フィールドタイプ。数値型byte、short、int
およびlong
レルムがマッピングされていますlong
。これらの標準フィールドタイプに加えて、レルムもサポートRealmObject
とRealmList <? extends RealmObject>
モデルの関係に拡張します。
箱入りBoolean、Byte、Short、Integer、Long、 Float
とDouble
モデルクラスでも使用することができます。これらの型の値であってもよいですnull
。
3.2必須フィールド
@Required
注釈は、それを必要とフィールドではなく、任意のフィールドを作り、ヌル値に禁止マークレルム分野で使用することができます。のみ@Requiredコメントを使用Boolean、Byte、Short、Integer、Long、Float、Double、String、byte[]
してDate
。あなたが他のフィールドタイプに追加した場合、コンパイラは失敗します。
基本型となるRealmList
フィールドの型は必須ではありません。RealmObject
フィールドのタイプは、常に空にすることができます。
3.3プライマリ
使用@PrimaryKey
注釈フィールドが主キーモデルとしてマークされています。これは、フィールドタイプ(文字列でなければなりませんString
)または整数(byte, short、int、long、Byte、Short、Integer
とLong
)。文字列:自動的にフィールドの主キーのインデックスとして文字列フィールド@PrimaryKey
ノート暗黙的に設定され@Index
た注釈。レルム複合キーは、サポートされていない、すなわち、単一の主キーとして複数のフィールド。
主キーは使用することができますcopyToRealmOrUpdate()
またはinsertOrUpdate()
方法。彼らは与えられた主キーを持つオブジェクトを探して、それを更新する(オブジェクトキーがすでに存在するがある場合)または(キーが存在しない場合)、それを作成します。あなたは主キークラスが存在しない状態で呼び出した場合copyToRealmOrUpdate()
、またはinsertOrUpdate()
例外がスローされます。
あなたは主キーを使用する場合は、(問い合わせ)を読んで、わずかに速くなりますが、書き込み(オブジェクトを作成し、更新は)遅くなります。性能の変化は、データ・セット・レルムのサイズに依存します。
してくださいノートRealm.createObject
新しいオブジェクトを返しますが、そのすべてのフィールドがデフォルト値に設定されています。オブジェクトが主キーを持つクラスである場合、競合が(対象が既に存在していてもよい主キーセットを有している)が発生してもよいです。これを避けるために、あなたは、管理対象外のオブジェクトを作成し、そのフィールドの値を設定し、使用することができますcopyToRealm()
またはinsert()
レルムに追加します。
final MyObject obj = new MyObject();
obj.setId(42);
obj.setName("Fish");
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// 在Realm中创建一个新对象,或者如果该对象已经存在(相同的主键),则抛出异常。
// 更新具有相同主键的现有对象,或者如果没有主键的对象= 42,则创建一个新对象
realm.copyToRealmOrUpdate(obj);
}
});
しない限り、組み合わせ注釈、または整数(またはパッキンの種類とは)一次キー有し得る値。@PrimaryKey
@Required
String
Byte,Short,Integer
Long
null
3.4プロパティのインデックス
使用などの主キーとして、インデックスにフィールド@Index
の注釈。これは少し遅く書きますが、より高速な読み込みます。(ストアインデックスファイルも少しあなたのレルムになります)特定の状況の読み取り性能を最適化する場合にのみインデックスを追加して、より良いです。
缶String、byte、short、int、long、boolean
やDate
インデックスを使用してフィールド。
3.5は、プロパティを無視します
あなたはレルムにフィールドにモデルを保存したくない場合は、コメントを使用してください@Ignore
。たとえば、あなたがより多くのモデルより含むフィールドを入力した場合、あなたはこれらのデータフィールドを使用しない特殊な状況の多くに対処する必要がありますする必要はありません、あなたはそうすることができます。
マークしないstatic
とtransient
フィールドは常に無視され、何の@Ignore
コメント。
3.6カウンタカウンタ
提供レルムMutableRealmInteger
特殊な整数型として。MutableRealmIntegerは、あなたが使用することができ、追加のAPIを開示し同步Realms
、より明確に表現意図とより良い紛争解決手続きを生成します。
従来は、その値がカウンタを読み取るだけインクリメントし、それが実現するように設定されます(myObj.counter + = 1
)。両方が11の値、例えば10値、その増加、および格納を読み取るため、非同期の場合(例えば、2つのクライアントがオフラインである場合)、それは、うまく機能しません。変更は、彼らが接続を回復し、その値をマージしようとするとき、最終的に、彼らは代わりに予想される12の11にあるカウンターに同意します。
MutableRealmIntegers
伝統的な整数型のサポートから、その場からbyte、short、int
またはlong
変更がMutableRealmInteger
移行する必要はありません。
MutableRealmInteger
ない不変の標準として、Javaのプリミティブ数値型として。それは、次のような、実際のオブジェクトであるRealmObject,RealmResults
とRealmList
。レルムを書くときに、ことこれは意味MutableRealmInteger
、その中に含まれる値を変更することができます。そのため、あなたがしなければならないMutableRealmInteger
フィールドがマークされていますfinal
。
public class Party extends RealmObject {
public final MutableRealmInteger guests = MutableRealmInteger.valueOf(0);
}
カウンタ値を変更するには、単に呼び出しますcounter.increment()
かcounter.decrement()
。
Party party = realm.where(Party.class).findFirst();
realm.beginTransaction();
party.guests.get(); // 0
party.guests.increment(1); // 1
party.guests.decrement(1); // 0
party.guests.increment(5); // 5
party.guests.decrement(1); // 4
realm.commitTransaction();
カウンタをリセットするには、使用することができcounter.set()
、それのために新しい値を代入します。
セット()を呼び出し、他のデバイスの増分()とデクリメント()操作から上書きされる可能性があります。通常最後は正常に書き込まれ、したがって、非可逆の場合のみカウンタはこれらの操作が行われるべきである混合許容できるものであったがマージされました。
Party party = realm.where(Party.class).findFirst();
realm.beginTransaction();
party.guests.set(0);
realm.commitTransaction();
3.7カバー属性名
デフォルトの動作では、名前のように定義モデルクラスのレルムの名前を使用することですレルムクラスとフィールドの内部文書ことを示しています。いくつかのケースでは、この動作を変更することもできます。
- 同じプロジェクトのためにサポートしていますが、順序2モデルクラスにパッケージが見つかっていません。
- 異なる命名規則などのクロスプラットフォーム・アーキテクチャの使用を簡単にするために。
- 以上57文字レルム必須使用のJavaクラス名の長さを制限します。
- 移行プロセスを完了するためにユーザーを強制することなく、Javaアプリケーションでのフィールド名を変更します。
これらのケースでは、あなたが使用することができる@RealmModule,@RealmClass
、または@RealmField
名前を覆うように別の名前を定義し、注釈が内部的に使用しました。
あなたができるモジュールポリシー定義を命名、これはモジュールのすべてのクラスのセクションに影響します。
@RealmModule(
allClasses = true,
classNamingPolicy = RealmNamingPolicy.LOWER_CASE_WITH_UNDERSCORES,
fieldNamingPolicy = RealmNamingPolicy.LOWER_CASE_WITH_UNDERSCORES
)
public class MyModule {
}
あなたはクラスのカスタム名を定義することができ、またはクラスはフィールドが戦略を命名すべてのフィールドに影響を与えます定義することができます。これは、すべてのモジュールレベルの設定をカバーします。
@RealmClass(name = "__Person", fieldNamingPolicy = RealmNamingPolicy.PASCAL_CASE)
public class Person extends RealmObject {
public String name;
}
あなたは、すべてのクラスとクラスモジュールモジュールレベルの設定をカバーする分野、のカスタム名を定義することができます。
public class extends RealmObject {
@RealmField(name = "person_name")
public String name;
}
異なる内部名に使用されるJavaクラスモデルの名前を選択し、以下の意味を有します。
- DynamicRealmは内部名を使用する必要がありますに照会します。通常のレルムの例では、クエリは、Javaのクラス定義の名前を使用し続けなければなりません。
- あなたは、クラスやフィールドを作成すると、移行は内部名を使用する必要があります。
- レポート・エラー・アーキテクチャは、内部名を使用します。
ノートには、名前の変更は、JSONデータからインポート内部には影響しないだろうしてくださいということ。JSONデータはまだレルムのJavaクラス定義の名前に従わなければなりません。
JSONを解析するように標準ライブラリモシ、GSONジャクソンや使用している場合、これらのライブラリは、JSONからJavaへの変換を定義することを覚えておくようにしてください、そして内部のレルム名までのセットは、ファイルのレルムへJavaからの移行を定義します。あなたはJSONからレルムへのデータのインポートにこれらのライブラリを使用したい場合は、この手段は、あなたはまだJSONパーサーライブラリとレルムのコメントを提供する必要があること。
使用モシ、それは次のようになります。
public class Person extends RealmObject {
@Json(name = "first_name") // JSON输入中使用的名称。
@RealmField(name = "first_name") // Realm文件内部使用的名称。
public string firstName; // Java中使用的名称
}
詳細については、RealmNamingPolicyを。