0

Android で SQL クエリの結果に予期しない矛盾が発生しています。

次のスキーマが与えられた場合 (これは非常に単純です):

public static final String TABLE_TOTD = "totd";
public static final String COLUMN_ID = "id";
public static final String COLUMN_TG = "tg";
public static final String COLUMN_EX = "ex";

private static final String DATABASE_NAME = "TOTD.db";

private static final String DATABASE_CREATE = "CREATE TABLE "
        + TABLE_TOTD + "("
            + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + COLUMN_TG + " TEXT NOT NULL, "
            + COLUMN_EX + " TEXT"
        + ");";

データベースが初期化され、いくつかのサンプル テキストが入力されます。

    SQLiteDatabase db = mdbHelper.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(MySQLiteHelper.COLUMN_TG, "This is a text (1)");
    values.put(MySQLiteHelper.COLUMN_EX, "Example goes here");

    db.insert(MySQLiteHelper.TABLE_TOTD, null, values);
    [...]

SQLiteDatabase.query() を使用してクエリを実行すると、一貫性のない結果が返されます。次のコードは、テーブルの最初の行で Cursor を返すことにより、期待どおりの動作を行います。

    String[] projection = null;
    String selection = "id = 1";
    String[] selectionArgs = null;
    Cursor cursor = db.query(
            MySQLiteHelper.TABLE_TOTD,
            projection,
            selection,
            selectionArgs,
            null, null, null);

selectionと を次のように変更しても、まったく同じselectionArgsように機能します。

    String selection = "id = ?";
    String[] selectionArgs = {"1"};

しかし、予想とは異なり、次の変更を実行すると、返される Cursor が空になります。

    String selection = "? = ?";
    String[] selectionArgs = {"id", "1"};

実際には、引数にないものをプッシュしようとする"1"と、クエリは空のカーソルを返します。

私は次のことを試しました:

    String selection = "? = 1";
    String[] selectionArgs = {"id"};

    String selection = "id ? 1";
    String[] selectionArgs = {"="};

    String selection = "?";
    String[] selectionArgs = {"id = 1"}; //This is where I couldn't take it anymore...

今、私はこれについてのあらゆる種類の説明に対して心を開いています. 私のコードは機能し、selection禁止されている文字が含まれていないため、すべての引数を文字列に配置できることがわかっています。私が知りたかったのは、なぜそれが機能しないのか、開発者向けドキュメントにこの明確な制限について言及されていないのはなぜですか?

4

1 に答える 1

0

選択引数は、WHEREsqlite クエリの句です。? を使用してクエリを実行すると、この引数は、selectionArgs 文字列配列で検索されます。ただし、値は ? としてのみ指定できます。鍵ではありません。いくつかの有効な例:

String selection = "id = ?";
String[] selectionArgs = new String[]{"1"};

と類似しています

String selection = "id = 1";
String[] selectionArgs = null;

しかし、あなたはできません

String selection = "? = ?";

? を複数指定することもできます。選択で。

String selection = "id = ? AND carId = ?";
String[] selectionArgs = new String[]{"1", "2"};

ドキュメントから:

?s を選択に含めることができます。これは、選択に表示されるために、selectionArgs からの値に置き換えられます。値は文字列としてバインドされます。

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.文字列[]、java.lang.String、java.lang.String、java.lang.String、java.lang.String)

于 2015-04-07T23:36:14.393 に答える