2014年9月23日火曜日

Titanium Tips: Model の comparator で時間の降順にソート

今回アプリを作るにあたって、実装で少し苦労・工夫したところの一つは、Alloy の Model で指定できる comparator の実装でした。
私がやりたかったことは、SQLite に格納した日時の値(yyyy/MM/dd HH:mm:ss)を使っての降順のソートでした。

comparator を実装すればソートとかが出来るようなことを
に書いてあるわけですが、今ひとつこの説明だけでは分かりません。
ベースとなっている Backbone.js の仕様も参照しないと分からないです。
では、comparator に実装する関数について
"sortBy" comparator functions take a model and return a numeric or string value by which the model should be ordered relative to others.
"sort" comparator functions take two models, and return -1 if the first model should come before the second, 0 if they are of the same rank and 1 if the first model should come after.
  • 1つのモデル中のデータを使って、何かソートの基準となる値を1つ返す方法
  • 2つのモデルの値を比較して(モデル中の複数の項目を比較して良い)、その結果、2つをソートしたい順番に応じた値(-1,0,1)を返す方法
の2種類の方法を用意しています。
(実装例などはこちらを参照 → Backbone.js 日本語リファレンス

私自身のは、単純に1項目(日時)で降順にしたかっただけなので、
  • 前者の方法を取り
  • yyyy/MM/dd HH:mm:ss からいわゆるUNIXタイムスタンプを取得し、それをマイナスした値を返すようにした
    (これで大きい日付の方が、小さい値を返すことになるので)
実際の実装はこんな感じです。
comparator : function(item) {
   return -(new Date(item.get('date_when')).getTime());
}
このように分かってみれば、モデルのデータを基に、何らかの形で希望の数値・文字列に加工して返すだけでソートが実現できますので簡単で便利だと思います。

この Model を Table View 辺りに binding すれば、それだけで希望のソート順で表示できるようになります。



Android アプリを Titanium Studio/Alloy を使って作ったので、その際にひっかかったことを、Tips で書いていってます。
実際に同じところで躓いた人がいて、それの解決のお役に立てば、と思っています。
ちなみに環境は Windows + Titanium Studio 3.3 + Android用開発となっています。

ただ、まったくのピンポイントでの Tips なので、まとまっての記述を期待している人にはすいません。

0 件のコメント:

コメントを投稿