条件の絞り込み
前回はRealmに登録されているデータを全て抽出しました。
今回は、条件を絞り込んで表示してみたいと思います。
といっても、とても簡単で、
データを全て抽出していた下記のコードを少し書き換えるだけです。
//Realmに存在するすべてのデータを取得する result = query.findAll();
登録データ
仮に下記の表にあるようなデータが入っているとした時に条件を絞り込んで表示してみます。
id(int) | name(String) |
10 | 佐藤 |
20 | 高橋 |
30 | 坂本 |
40 | 藤原 |
条件1)idが15以上のデータを表示
result = query.greaterThan("id", 15).findAll();
条件2)nameが高橋か藤原のデータを表示
result = query.equalTo("name", "高橋") .or() .equalTo("name", "藤原") .findAll();
とても簡単に条件を絞り込めましたね。
他にも色々な条件を指定できるので、こちらで確認してみてください!!
データのソート
次に抽出したデータをソートする処理をしてみたいと思います。
抽出したデータを並び替えたいと思います。
なお、Realmに並び替えの処理が存在するのですが、 今回紹介させていただく方法は別の方法を利用しています。
並び替えに必要なデータは
・現在地の緯度・経度
・各データの緯度・経度
になります。
※現在地の緯度・経度の取得は本内容とは直接関係ないので、割愛致します。
「現在地から近い順」に並び替える手順
1. 現在地から緯度・経度を取得
2. Realmに登録されているデータから緯度・経度を取得
3. 上記の1と2のデータから距離を算出
4. 距離を含む各データをArrayListに格納
5. ArrayListのデータを距離が近い方から並び替える
6. 並び替えたArrayListをListViewで表示
といった流れで処理させていきます。
- 現在地から緯度・経度を取得(現在地の緯度・経度は取得できているものとします。)
- Realmに登録されているデータから緯度・経度を取得
- 距離を算出
- 距離を含む各データをArrayListに格納
それぞれの電源の使えるカフェのデータには緯度・経度があり、それらはRealmに登録されているので取得していきます。
//ListViewに表示させるデータを抽出する処理 for(int i = 0; i < result.size(); i++){ FavoriteModel favoriteModel = new FavoriteModel(); //緯度を取得 double latitude = result.get(i).getLatitude(); //経度を取得 double longitude = result.get(i).getLongitude(); //現在地と登録されているデータの距離を算出 double distance = (latitude - nowLatitude) * (latitude - nowLatitude) + (longitude - nowLongitude) * (longitude - nowLongitude); //Modelにそれぞれの値を格納していく favoriteModel.setId(result.get(i).getId()); favoriteModel.setDistance(distance); favoriteModel.setName(result.get(i).getName()); //ModelをArrayListに格納 objects.add(favoriteModel); } realm.close();
5. ArrayListのデータを距離が近い方から並び替える
Collectionsクラスのsortメソッドを利用して並び替えをおこないます。
//距離が近い順にArrayListを並び変える Collections.sort(objects, new Comparator<FavoriteModel>() { @Override public int compare(FavoriteModel lhs, FavoriteModel rhs) { return lhs.getDistance() < rhs.getDistance() ? -1 : 1; } });
6. 並び替えたArrayListをListViewで表示
最後にListViewに設定すれば、「現在地から近い順」で表示されます!!
//ArrayListに格納したデータをAdapterに設定 favoriteAdapter = new FavoriteAdapter(getActivity() , 0 , objects); listView = (ListView)view.findViewById(R.id.favorite_list); //Adapterに設定されたそれぞれの値をListViewで表示する listView.setAdapter(favoriteAdapter);
以上で完成です!
改めて見て、もっといい方法があるはずと実感。。。