・nameフィールドの値が"John"または"Peter"であるデータの取得方法
// Build the query looking at all users:
RealmQuery<User> query = realm.where(User.class);
// Add query conditions:
query.equalTo("name", "John");
query.or().equalTo("name", "Peter");
// Execute the query:
RealmResults<User> result1 = query.findAll();
// Or alternatively do the same all at once (the "Fluent interface"):
RealmResults<User> result2 = realm.where(User.class)
.equalTo("name", "John")
.or()
.equalTo("name", "Peter")
.findAll();
・findAllSorted() ソートされた結果を返す。
findAllAsync() 非同期実行する。
・該当データがない場合は、size()=0 となる。
・where()
・すべてのデータ型に使える
equalTo()
notEqualTo()
in()
・数値型およびDate型に使える
between()
greaterThan()
lessThan()
greaterThanOrEqualTo()
lessThanOrEqualTo()
・String型に使える
contains()
beginsWith()
endsWith()
like()
3番目の引数
Case.INSENSITIVE 大文字小文字の区別を蒸し
Case.SENSITIVE 大文字小文字を区別 (デフォルト)
like()のワイルドカード
* 0個または複数のユニコード文字列にマッチ
? 1つのユニコード文字にマッチ
・バイナリデータと文字列の空の値
isEmpty()
isNotEmpty()
・nullにマッチ
isNull()
isNotNull()
・論理演算
・全ての条件式は暗黙的に論理積(AND)になる。
論理和(OR)を使う場合は明示的に or() を使用する。
・評価準を指定するために beginGroup() と endGroup() を用いて
条件をグループ化できる。
RealmResults<User> r = realm.where(User.class)
.greaterThan("age", 10) // implicit AND
.beginGroup()
.equalTo("name", "Peter")
.or()
.contains("name", "Jo")
.endGroup()
.findAll();
・not()は beginGroup()とendGroup()のみに使える。
RealmResults<User> r = realm.where(User.class)
.not()
.beginGroup()
.equalTo("name", "Peter")
.or()
.contains("name", "Jo")
.endGroup()
.findAll();
・in()
RealmResults<User> r = realm.where(User.class)
.not()
.in("name", new String[]{"Peter", "Jo"})
.findAll();
・並べ替え
RealmResults<User> result = realm.where(User.class).findAll();
result = result.sort("age"); // 昇順にソート
result = result.sort("age", Sort.DESCENDING);// 降順にソート
・distinct()
RealmResults<Person> unique = realm.where(Person.class).distinct("name");
・集計
RealmResults<User> results = realm.where(User.class).findAll();
long sum = results.sum("age").longValue();
long min = results.min("age").longValue();
long max = results.max("age").longValue();
double average = results.average("age");
long matches = results.size();
・繰り返し処理とスナップショット
Realmコレクションは値が設定されると即座に反映されるので
要素を順番に変更するにはスナップショットを取得する。
RealmResults<Person> guests = realm.where(Person.class).equalTo("invited", false).findAll();
// Use a snapshot to invite all guests
realm.beginTransaction();
OrderedRealmCollectionSnapshot<Person> guestsSnapshot = guests.createSnapshot();
for (int i = 0; guestsSnapshot.size(); i++) {
guestsSnapshot.get(i).setInvited(true);
}
realm.commitTransaction();
・削除
// クエリを発行し結果を取得
final RealmResults<Dog> results = realm.where(Dog.class).findAll();
// 変更操作はトランザクションの中で実行する必要あり
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// マッチしたオブジェクトから1つを削除
results.deleteFromRealm(0);
results.deleteLastFromRealm();
// 特定のオブジェクトのみを削除
Dog dog = results.get(5);
dog.deleteFromRealm();
// すべてのオブジェクトを削除
results.deleteFromRealm();
}
});
・非同期クエリ
RealmResultsが更新される際に通知を受け取る場合は、
RealmChangeListenerを登録する。
このリスナはRealmResultsが更新されるたびに呼び出される。
private OrderedRealmCollectionChangeListener<RealmResults<User> callback = new OrderedRealmCollectionChangeListener<>() {
@Override
public void onChange(RealmResults<User> results, OrderedCollectionChangeSet changeSet) {
if (changeSet == null) {
// The first time async returns with an null changeSet.
} else {
// Called on every update.
}
}
};
public void onStart() {
RealmResults<User> result = realm.where(User.class).findAllAsync();
result.addChangeListener(callback);
}
public void onStop () {
result.removeChangeListener(callback); // 特定のリスナの登録を解除
// または
result.removeAllChangeListeners(); // 登録されている全てのリスナの登録を解除
}
・クエリの完了チェック
RealmResults<User> result = realm.where(User.class).findAllAsync();
if (result.isLoaded()) {
// クエリの結果を利用した処理
}
0コメント