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
禁止されている文字が含まれていないため、すべての引数を文字列に配置できることがわかっています。私が知りたかったのは、なぜそれが機能しないのか、開発者向けドキュメントにこの明確な制限について言及されていないのはなぜですか?