2013年10月6日日曜日

limitはどこで指定する?

sourceはAndroid14です。

SQLiteDatabaseの1481行目の
public Cursor query(String table, String[] columns, String selection,
            String[] selectionArgs, String groupBy, String having,
            String orderBy) {

        return query(false, table, columns, selection, selectionArgs, groupBy,
                having, orderBy, null /* limit */);
    }
あ、nullなんすか。そーすか。
前の記事でSQLはStringBuilderでappendして作られることがわかったから、
無理やりどっかにつけようと思えばできる。
できるけどもやらないほうがいいかもしれない。

不勉強だったので、queryの引数が違うものがあることを知らなかった汗
distinctやlimitを使いたい場合は、同じqueryメソッドの引数が違うタイプのものがあるので、
そちらを使いましょう。

start
db.query(String table, String[] columns, String selection,
            String[] selectionArgs, String groupBy, String having,
            String orderBy)
query・・・引数はそのまま。ここでdistinctはfalse指定。Limitはnull指定。
query・・・引数にdistinctのbooleanとLimit句のStringがある。
rawQueryWithFactory
end

ちなみにrawquery()だとすぐrawQueryWithFactoryに行く。

で、rawQueryWithFactoryで
 public Cursor rawQueryWithFactory(
            CursorFactory cursorFactory, String sql, String[] selectionArgs,
            String editTable) {
        verifyDbIsOpen();
        BlockGuard.getThreadPolicy().onReadFromDisk();

        SQLiteDatabase db = getDbConnection(sql);
        SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(db, sql, editTable);

        Cursor cursor = null;
        try {
            cursor = driver.query(
                    cursorFactory != null ? cursorFactory : mFactory,
                    selectionArgs);
        } finally {
            releaseDbConnection(db);
        }
        return cursor;
    }
driver.queryの引数内の判定で、引数の違うタイプを使っている。
これはこれで便利だけど、書き方としてはちょっと。。。
流儀だと思うので不問ということで。

んー。
ここのフィールドの値はUNIQUEですよってのがわかれば、Limit判定ができるってことかな。

0 件のコメント:

コメントを投稿