2

私はQueryBuilderを使用して、無効な文字を手動でエスケープしないようにするために、後で生のSQLで使用される内部SQLを構築しています。

SelectArg friendsIN = new SelectArg(friendsUsernames);
QueryBuilder<MyObject, Integer> qb = myObjectDao.queryBuilder();
qb.selectRaw("username", "MAX(time) AS latestTime").groupBy("username").where()
    .in("username", friendsIN);
String innerSelect = pq.getStatement();

friendsUsernamesとして定義されArrayList<String>ます。

次に、を使用しinnerSelectて外部選択を作成します。

String select = "SELECT w.id FROM (" + innerSelect +") AS x INNER JOIN myObject AS w on w.username = x.username AND w.time = x.latestTime";
GenericRawResults<String[]> results = myObjectDao.queryRaw(select);

しかし、予想通り、私innerString'?'電話をかけたとき、私queryRawmyObjectDao何の結果も得られませんでした。queryRawの配列としてfriendsUsernameを指定しようとしました。

GenericRawResults<String[]> results =
    myObjectrDao.queryRaw(select,
         friendsUsernames.toArray(new String[friendsUsernames.size()]));

しかし、次のエラーが発生します。

android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException:
      bind or column index out of range: handle 0x17a22e8

OrmLiteを使用してこの種のクエリを実行する方法に関する提案はありますか?

4

1 に答える 1

4

ええ、それはうまくいきません。クエリには1つしか?ありませんが、ユーザー名の配列を渡そうとしています。?SQL引数の数とメソッドに渡される引数の数は正確に1対1で対応している必要がありますqueryRaw(...)

が固定サイズの場合friendsUsernames、次のようなSQLを生成する次のようなことができるはずです"in (?, ?, ?, ?)"

List<SelectArg> friendsInList = new ArrayList<SelectArg>();
for (int i = 0; i < NUM_FRIENDS; i++) {
   // it doesn't matter what the value is since you just want the ?
   fieldsInList.add(new SelectArg());
}
...in("name", friendsInList);

ただし、名前のリストが動的である場合は、その場でこれを行う必要があります。これ?も、メソッドに渡される引数の数とqueryRaw(...)正確に一致する必要があるためです。

于 2012-08-29T12:38:30.707 に答える