Android SQLite查询不检索数据

时间:2016-06-08 14:07:51

标签: android sqlite

我正在使用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);

2 个答案:

答案 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个查询中的问题。