【发布时间】:2015-04-08 07:36:14
【问题描述】:
我在 Android 上的 SQL 查询结果遇到一些意外的不一致。
给定以下 Schema(非常简单):
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"};
但现在,与预期不同的是,通过执行以下更改,返回的光标现在将为空:
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 字符串上,因为它们不包含任何禁止字符。
我只是想知道,为什么它不起作用,为什么开发者文档中没有提到这个明确的限制?
【问题讨论】:
标签: android database sqlite android-database