braineer dispatch

ニュース・コラム

スキル 2017年 7月30日 365

AndroidでRealmを使ってみた〜お気に入り機能の実装(其の四)〜

AndroidでRealmを使ってみた〜お気に入り機能の実装(其の四)〜

条件の絞り込み

前回は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で表示

といった流れで処理させていきます。

 

1. 現在地から緯度・経度を取得

現在地の緯度・経度は取得できているものとします。

 

2. Realmに登録されているデータから緯度・経度を取得
3. 距離を算出
4. 距離を含む各データを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);

 

以上で完成です!

改めて見て、もっといい方法があるはずと実感。。。

ページ上へ