Skip to content

Instantly share code, notes, and snippets.

@CH3COOH
Last active August 29, 2015 14:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CH3COOH/165cdb30900f2c738c0c to your computer and use it in GitHub Desktop.
Save CH3COOH/165cdb30900f2c738c0c to your computer and use it in GitHub Desktop.
Realm-Javaのバグっぽい挙動
// Piyo class
public class Piyo extends RealmObject {
@PrimaryKey
private int id;
}
public static RealmResults<Piyo> getPiyo(Realm realm, List<Integer> ids) {
RealmQuery<Piyo> q = realm.where(Piyo.class);
for (int i: ids) {
q = q.equalTo("id", i).or();
if (i != ids.get(ids.size() - 1)) {
q = q.or();
}
}
return q.findAll();
}
// case1. 要素が10件あって、重複が1件混じっている。9件返ってきて欲しい
List<Integer> hoge = new ArrayList<>();
hoge.add(93); // 重複してるid
hoge.add(61); // これが消える
hoge.add(96);
hoge.add(49);
hoge.add(72);
hoge.add(2);
hoge.add(92);
hoge.add(137);
hoge.add(86);
hoge.add(93); // 重複してるid
RealmResults<Piyo> hoges = getPiyo(realm, hoge);
8件しか返ってこない。なぜか id:61の要素が消えている
// case2.要素が 3件あって、重複が1件混じっている。2件返ってきて欲しい
List<Integer> hoge = new ArrayList<>();
hoge.add(93);
hoge.add(61);
hoge.add(93);
RealmResults<Piyo> hoges = getPiyo(realm, hoge);
なぜか id:61の要素が消える
// case3.要素が 2件あって、重複が混じっていない。2件返ってきて欲しい
List<Integer> hoge = new ArrayList<>();
hoge.add(93);
hoge.add(61);
RealmResults<Piyo> hoges = getPiyo(realm, hoge);
id:61とid:93の要素が取得できる
@kishikawakatsumi
Copy link

ありがとうございます。こちらでも再現しました。さらに調べてみます。

q = q.equalTo("id", i).or();

おそらく ↑ の部分は、

q = q.equalTo("id", i);

↑ の間違いでしょうか。for文中のifの条件が、最後の項目でなければor()をつける、だと思いますので。

@kishikawakatsumi
Copy link

原因はif (i != ids.get(ids.size() - 1))のところで、インデックスじゃなくて要素の値で判定しているので、重複のために最初の要素が最後の要素と判定されて正しくor()が繋がってないからです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment