我正在使用Android RowQueries
方式从db中检索我的文件夹。
这是我正在检查的参数:
protected final static String FOLDER_COLUMN_ID = "_id";
这些查询按预期检索1行:
String query1 = "SELECT * FROM " + FOLDER_TABLE + " WHERE 1";
Cursor c1 = db.rawQuery(query1, null);
c1.moveToFirst();
String query2 = "SELECT * FROM " + FOLDER_TABLE + " WHERE _id = 1";
Cursor c2 = db.rawQuery(query2, null);
c2.moveToFirst();
这一切都很完美。我的问题是参数被?
和string[]
替换。
PS: 检索到的行的"_id"
列的值为 1
这些查询都无效(调试次数相同,未检索到数据):
String query = "SELECT * FROM " + FOLDER_TABLE + " WHERE ? = ?";
Cursor c = db.rawQuery(query, new String[]{FOLDER_COLUMN_ID, String.valueOf(_id)});
c.moveToFirst();
String query1 = "SELECT * FROM " + FOLDER_TABLE + " WHERE _id = ?";
Cursor c1 = db.rawQuery(query1, new String[]{String.valueOf(_id)});
c1.moveToFirst();
String query2 = "SELECT * FROM " + FOLDER_TABLE + " WHERE ? = 1";
Cursor c2 = db.rawQuery(query2, new String[]{FOLDER_COLUMN_ID});
c2.moveToFirst();
我无法弄清楚为什么我有这个问题,我错过了什么?谢谢大家
修改
这就是我创建实体的方式:
protected final static String FOLDER_TABLE = "folder";
protected final static String FOLDER_COLUMN_ID = "_id";
protected final static String FOLDER_COLUMN_PASSWORD_PROTECTED = "_password_protected";
protected final static String FOLDER_COLUMN_PASSWORD = "_password";
protected final static String FOLDER_COLUMN_NAME = "_name";
protected final static String FOLDER_COLUMN_PARENT_FOLDER_ID = "_parent_folder_id";
protected final static String FOLDER_COLUMN_PARENT_FOLDER_NAME = "_parent_folder_name";
protected final static String FOLDER_COLUMN_FULL_PATH = "_full_path";
String queryFolder = "CREATE TABLE " + FOLDER_TABLE + "(" +
FOLDER_COLUMN_ID + " INTEGER PRIMARY KEY, " +
FOLDER_COLUMN_PASSWORD_PROTECTED + " INTEGER, " +
FOLDER_COLUMN_PASSWORD + " TEXT, " +
FOLDER_COLUMN_NAME + " TEXT, " +
FOLDER_COLUMN_PARENT_FOLDER_ID + " INTEGER, " +
FOLDER_COLUMN_PARENT_FOLDER_NAME + " TEXT, " +
FOLDER_COLUMN_FULL_PATH + " TEXT " +
");";
db.execSQL(queryFolder);
答案 0 :(得分:1)
关于最后一个查询
String query2 = "SELECT * FROM " + FOLDER_TABLE + " WHERE ? = 1";
Cursor c2 = db.rawQuery(query2, new String[]{FOLDER_COLUMN_ID});
c2.moveToFirst();
这将被解释为.. WHERE '_id' = 1
,它将文本常量与int常量进行比较。 rawQuery()不能替换数据库对象名称的参数。如果您需要变量列,则应该使用与FOLDER_TABLE
构建查询字符串相同的方式完成。
String query2 = "SELECT * FROM " + FOLDER_TABLE + " WHERE "+ FOLDER_COLUMN_ID + "= 1";
第一个查询..WHERE 1
实际上根本没有WHERE
,它会返回所有行。
答案 1 :(得分:-1)
看起来你与第二个不工作的查询非常接近。
String query1 = "SELECT * FROM " + FOLDER_TABLE + " WHERE _id = ?";
Cursor c1 = db.rawQuery(query1, new String[]{String.valueOf(_id)});
c1.moveToFirst();
但有两件事。首先,我不明白您使用String.valueOf
的原因。
其次,我建议声明一个测试变量,比如row_i_want,并使用它代替_id。
看起来您没有将_id声明为变量,因此将其作为参数传递会导致空指针异常。所以你的查询看起来像这样:
String row_i_want = "1";
String query1 = "SELECT * FROM " + FOLDER_TABLE + " WHERE _id = ?";
Cursor c1 = db.rawQuery(query1, new String[]{row_i_want});
c1.moveToFirst();
更新不同的解释:
您的第二个查询有效的原因是您已经使用1的值进行了硬编码。
String query2 = "SELECT * FROM " + FOLDER_TABLE + " WHERE _id = 1";
这种查询很适合测试,并证明你的数据库中有一些东西,但是当你希望用户能够提供输入并搜索你的数据库时。为此,您需要使用动态条件,您需要使用?和一个String []。
让我们假装你的Android应用程序要求用户按行搜索,oyu有一个用户可以输入的EditText。
EditText et_input;
初始化EditText后,您可以使用以下内容提取其内容:
String input = user_input.getText().toString();
现在您已收到用户的输入,您可以使用它来查询您的数据库,如下所示:
String query1 = "SELECT * FROM " + FOLDER_TABLE + " WHERE _id = ?";
Cursor c1 = db.rawQuery(query1, new String[]{input});
您的错误使用_id作为动态条件与String []的第4个查询中的问题。