2011年10月30日

[Android] JDOでの条件検索・ソートでの注意点

GAEでの実装をしていて、JDOを使ってDatastoreにアクセスしているのですが、
条件で絞って検索したりソートする際に制限があったので備忘メモ。

■制約
・PersistenceManagerのクエリ実行で使うexecute()に与えられる検索条件は3つまで
・ソート設定のsetOrdering()で使えるのは、setFilter()で使用した項目の中のみ。
 setFilter()で未使用の項目はsetOrdering()で使えない
 ⇒JDOでのソートは諦めて、プログラム側でソートした
 ⇒プログラム側でソートする場合、「Comparator」を使うと簡単に実現できた
 ⇒下記の参考サイトを参照

----------------------------------------------------
例)
PersistenceManager pm = PMF.get().getPersistenceManager();
// クエリを生成
Query pmquery = pm.newQuery(TestClass.class);
// 検索条件を設定
pmquery.setFilter("userID == pUserID && date < pEnddate && date > pStartdate");
// 日付で降順にソート(setFilterで未使用のパラメータは使用できない)
pmquery.setOrdering("date DESC");
// 検索条件の型を宣言
pmquery.declareParameters("Long pUserID, java.util.Date pStartdate, java.util.Date pEnddate");
// 検索実行で渡せるパラメーターは3つまで
List results = (List) pmquery.execute([ユーザーID], [開始日時(Date型)], [終了日時(Date型)]);

GsonBuilder gsonBuilder = new GsonBuilder();
// 日付フォーマットを指定
gsonBuilder.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Gson gson = gsonBuilder.create();
// 検索結果をJSON形式に変換
String jsonstr = gson.toJson(results);

… あとは、JSONを端末側に返す …
----------------------------------------------------

Slim3とか、他の実装方法だともっと良い解決方法があるのだろうか。。。
ネットで何でも調べられるって便利だなー。

■参考
JDOの制約 : http://www.atmarkit.co.jp/fjava/rensai4/bigtable03/02.html
Comparatorを使ったソート : http://education.yachinco.net/tips/java/03/2.html
posted by be-style at 03:48| Comment(0) | Android
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]