Last active
August 29, 2015 14:24
-
-
Save CH3COOH/165cdb30900f2c738c0c to your computer and use it in GitHub Desktop.
Realm-Javaのバグっぽい挙動
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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の要素が取得できる | |
原因は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
ありがとうございます。こちらでも再現しました。さらに調べてみます。
おそらく ↑ の部分は、
↑ の間違いでしょうか。for文中のifの条件が、最後の項目でなければ
or()
をつける、だと思いますので。