19

ContentResolver にこのクエリを実行させようとしています:

select * from myTable limit 1 offset 2

ContentResolverの唯一のクエリメソッドは次のとおりです。

resolver.query(uri, projection, selection, selectionArgs, sortOrder);

私はもう試した:

final Cursor c = resolver.query(
        MyTable.CONTENT_URI,
        MyTable.PROJECTION,
        " ? ?",
        new String[] {"1", "2"},
        null);

IllegaLArgumentException をスローするだけです。これを達成する正しい方法は何ですか?

4

4 に答える 4

26

sordOrderパラメーターにLIMIT句を配置しました。他のユーザーも同じことを行っていますが、100%正しいかどうかはわかりません。

final Cursor c = resolver.query(
        MyTable.CONTENT_URI,
        MyTable.PROJECTION,
        null,
        null,
        " limit 1 offset 2");
于 2012-09-28T13:31:27.923 に答える
24

コンテンツ プロバイダーを提供している場合はandroid.net.Uri.Builder#appendQueryParameter、コンテンツ プロバイダーがクエリの作成中に使用できるクエリ パラメーターとして limit および offset を提供するために使用できます。

public class MyProvider extends ContentProvider {
    public static final String QUERY_PARAMETER_LIMIT = "limit";
    public static final String QUERY_PARAMETER_OFFSET = "offset";

    public Cursor query(Uri uri, ...) {
        String limit = uri.getQueryParameter(QUERY_PARAMETER_LIMIT);
        String offset = uri.getQueryParameter(QUERY_PARAMETER_OFFSET);

        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();

        // set the table name,...

        // leaving handling of null conditions as an exercise to the reader.
        String limitString = offset + "," + limit;

        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder, limitString);

        //...

        return c;
    }
}

クエリの作成中:

private static final Uri CONTENT_URI = MyProvider.CONTENT_URI.buildUpon()
        .appendQueryParameter(MyProvider.QUERY_PARAMETER_LIMIT,
                    String.valueOf(limit))
        .appendQueryParameter(MyProvider.QUERY_PARAMETER_OFFSET,
                    String.valueOf(offset))
        .build();

android.net.Uri.Builder#appendQueryParameterは、SQL インジェクションを防ぐために値をエンコードすることに注意してください。

参考文献:

  1. http://laviefrugale.blogspot.com/2012/01/using-limit-with-android-contentprovider.html
  2. http://www.sqlite.org/lang_select.html
  3. https://stackoverflow.com/a/12476458/1523910 + @eocanha の回答
于 2014-06-05T08:39:54.900 に答える
0

以下を使用して制限文字列を使用しようとしたとき[以下の制限文字列を参照]:

 StringBuilder sbLimit = new StringBuilder().append(" ").append(i_offset).append(" , ").append(i_limit);
String limit = sbLimit .toString()

これにより、選択クエリ、並べ替え、およびグループ化と組み合わせて良い結果が得られました。

于 2015-03-09T06:44:01.043 に答える