0

.rawQuery の代わりに .query を使用して SQL データベース要求を書き込もうとしています (誰もがこれに同意しているわけではありませんが、より効率的であると言われています...)。

SQLで書く必要がある場合、おおよそ次のようになります。

select COL_NAME, COL_COMMENTS, KEY_ROW_ID   
from TABLE   
where COL_CAT1 = myVariable1 or myVariable2 or ... myVariableN  
or COL_CAT2 = myVariable1 or myVariable2 or .... myVariableN  
or COL_CAT3 = myVariable1 or myVariable2 or.... myVariableN

私はこれを試しました:

public Cursor findNameInTable(int myVariable1, int myVariable2, int myVariableN) {
    String where = COL_CAT1 + " = ? OR " + COL_CAT2 + "=?";
    String[] whereArgs = new String[] { Integer.toString(myVariable1), Integer.toString(myVariable2), Integer.toString(myVariableN)};
    c = myDatabase
            .query(DATABASE_TABLE, new String[] { KEY_ROWID, COL_NAME , COL_COMMENTS }, 
                    where,
                    whereArgs, null,
                    null, null);
    return c;
}

これに関する問題は、システムがこれを行っていることです:

    select .....
    from .....
    where COL_CAT1 = myVariable1 
    or COL_CAT2 = myVariable2
    or ???? = myVariableN  

そして、各変数を新しい列と比較することを期待しているため、クラッシュしますが、これは私が望むものではありません:列よりも多くの入力変数があります。

それは実際には「=?」です。これは適切ではないようですが、この種のリクエストを記述する方法を見つける方法はありません。ドキュメントのほとんどは、query() ではなく rawQuery() に関するものです。前もって感謝します。

4

2 に答える 2

1

これを試して

public Cursor findNameInTable(int myVariable1, int myVariable2, ..., int myVariableN) 
{
    String inInterval = "(?,?,?,...,?)"; // N question mark altogether.
    String where = COL_CAT1 + " IN " + inInterval 
                   + " OR " + COL_CAT2 + " IN " + inInterval
                   + ...........
                   + " OR " + COL_CATM + " IN " + inInterval;
int numberOfColumn = M; // The number of columns you have.
String[] whereArgs = new String[M * N];
for (int i = 0; i < M; i++)
{
     whereArgs[i * N + 0] = Integer.toString(myVariable1);
     whereArgs[i * N + 1] = Integer.toString(myVariable2);
     whereArgs[i * N + 2] = Integer.toString(myVariable3);
        ........................
     whereArgs[i * N + N - 1] = Integer.toString(myVariableN);
}  
Cursor c = myDatabase
        .query(DATABASE_TABLE, new String[] { KEY_ROWID, COL_NAME , COL_COMMENTS }, 
                where,
                whereArgs, null,
                null, null);
    return c;
}
于 2013-03-07T17:28:56.503 に答える
0

大規模なクエリを作成しているため、次の使用を検討することをお勧めします。

http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html

これにより、基本的に、より長い where 句を作成できます。でも; これは、理論的には StringBuilder を使用した rawQuery でも可能ですが、ベスト プラクティスでは、ラッパー アプローチ メソッドを使用することをお勧めします。

于 2013-03-07T18:27:36.477 に答える