2011-01-31 5 views
3

Androidプラットフォーム(2.2)でDBへのパラメータを使用してクエリを作成するときに問題があります。それから私は、パラメータ化クエリを使用して、これを照会しようとしていますAndroid:SQLiteクエリは整数パラメータをバインドしていませんか?

db.execSQL("CREATE VIRTUAL TABLE " + Msg._TABLE_NAME + " USING FTS3 (" 
      + Msg._ID + " INTEGER, " 
      (...) 
      + Msg.READ + " SHORT DEFAULT 0," 
      + Msg.URGENT + " SHORT DEFAULT 0" 
      + ");"); 

を::

String[] columns = new String[] {Msg.ROWID, Msg.TITLE, Msg.READ, Msg.URGENT}; 
(...) 
getContentResolver().query(Msg.CONTENT_URI, columns, 
    Msg.URGENT + "=? AND " + Msg.READ + "=?" + , whereArgs, null); 
whereArgsは、クエリごとに異なり

String[] urgentUnread = new String[]{"1", "0"}; 
String[] regularUnread = new String[]{"0", "0"}; 

けど何で私はこのような表を作成しましたデータが存在しても結果/行は0を返します。コンテンツプロバイダはのparamsを変更しないと、クエリは、「直接」クエリを呼び出すときQueryBuilder使用だけでなく、何も返さない:

Cursor c = db.query(tables, columns, where, whereArgs, groupBy, having, orderBy, limit); 

私は文字列の連結を行う場合は、クエリが動作します。

getContentResolver().query(Msg.CONTENT_URI, columns, 
    Msg.READ + "=0 AND " + Msg.URGENT + "=1", null, null); 

が、それはparamクエリの目的を殺してしまい、キャッシュするのが面倒です。 Dalvikは(たくさんのクエリを作成した後で)クエリのためのキャッシュに空きがなく、皮肉なことに、 '?'でパラメータ化されたクエリを使用するように指示しています。私は、私を信じることを愛しています:)

私はJavaDocの状態はパラメータがStringSとしてバインドされていることを知っていますが、私はそれを信じることができません...メジャー...エーム、... WTF

どこが間違っていましたか?

ありがとうございます。

答えて

3

これはOPです。私はさらに研究して実験していたので、非難するのはFTS3だと結論づけました。データがsearchable by fulltextである必要があるので、私はVIRTUAL TABLE USING FTS3を作成していて、パラメータのバインドに失敗しました。

私が直接(Msg_content)シャドー・テーブルを照会したくないので、私の解決策は、2つの関連テーブルにデータを分割することです:

db.execSQL("CREATE TABLE " + Msg._TABLE_NAME + " (" + 
    Msg._ID + PRIMARY_KEY_AUTOINC + 
    Msg.PRIORITY + " TEXT," + 
    Msg.RECEIVED + " INTEGER," + 
    Msg.MOBILE_STATUS + " INTEGER DEFAULT 0," + 
    Msg.READ + " SHORT DEFAULT 0," + 
    Msg.FLASH + " SHORT DEFAULT 0" + 
");"); 

db.execSQL("CREATE VIRTUAL TABLE " + MsgText._TABLE_NAME + " USING FTS3 (" + 
    MsgText._ID + PRIMARY_KEY + 
    MsgText.TITLE + " TEXT," + 
    MsgText.CONTENT + " TEXT," + 
    MsgText.KEYWORDS + " TEXT," + 
    "FOREIGN KEY(" + MsgText._ID + ") " + 
    "REFERENCES " + Msg._TABLE_NAME + "(" + Msg._ID + ") " + 
");"); 

その後、私は、クエリで使用するビューを作成しました:

db.execSQL("CREATE VIEW IF NOT EXISTS " + View.MSG_CONTENT + 
    " AS SELECT " + 
    Msg._TABLE_NAME + "." + Msg._ID + ", " + 
    Msg._TABLE_NAME + "." + Msg.READ + ", " + 
    Msg._TABLE_NAME + "." + Msg.FLASH + ", " + 
(...) 
    MsgText._TABLE_NAME + "." + MsgText.TITLE + ", " + 
    MsgText._TABLE_NAME + "." + MsgText.CONTENT + 
    " FROM " + Msg._TABLE_NAME + ", " + MsgText._TABLE_NAME + 
    " WHERE " + Msg._TABLE_NAME + "." + Msg._ID + "=" + 
    MsgText._TABLE_NAME + "." + MsgText._ID); 

これは、パラメータを使用してデータを照会し、必要なときに全文検索を実行できるので、私にとって非常にうまく機能します。クエリのパフォーマンスは、1つのテーブルのみを使用する場合と同じです。

これは、同じ問題にぶつかりそうな他の人に役立つことを願っています。

乾杯、
PES

P.S.チェックされたメタとit is OK to reply to self、明らかに。

+0

OKだけでなく、実際には、誰も解決策が出てこない場合は、共有するための名誉を見つけることができます。 –

関連する問題