当我尝试获取数据库 android sqlite 中的所有对象时出错

Error when I try get all object in database android sqlite

当值为 "completed" 时,我尝试获取数据库中的所有对象,但出现异常。我认为我的查询是正确的,因为我在另一种方法中使用相同的查询来仅恢复对象。

public List<DownloadProfile> getAllDownloadProfile(String state) {
    List<DownloadProfile> downloadProfiles = new ArrayList<>();
    Cursor cursor = db.rawQuery("SELECT * FROM " + DownloadEntry.TABLE_NAME
            + " WHERE " + DownloadEntry.COLUMN_NAME_DL_STATE + " = " + state + "", null);

    if (cursor.getCount() > 0) {
        cursor.moveToFirst();
        do {
            DownloadProfile downloadProfile = new DownloadProfile(-1, "", "", "");
            downloadProfile.path = cursor.getString(cursor.getColumnIndex(DownloadEntry.COLUMN_NAME_DL_PATH));
            downloadProfile.extension = cursor.getString(cursor.getColumnIndex(DownloadEntry.COLUMN_NAME_DL_EXTENSION));
            downloadProfile.downloadId = cursor.getInt(cursor.getColumnIndex(DownloadEntry.COLUMN_NAME_DL_ID));
            downloadProfiles.add(downloadProfile);

        } while (cursor.moveToNext());
    }
    cursor.close();
    return downloadProfiles;
}

我的例外:

Caused By : SQL(query) error or missing database.
(no such column: completed (code 1): , while compiling: SELECT * FROM download WHERE download_state = completed)
#################################################################
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1058)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:623)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1454)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1393)
    at com.samsung.sidia.rio360.database.DownloadDatabase.getAllDownloadProfile(DownloadDatabase.java:47)
    at com.samsung.sidia.rio360.model.DownloadModel.getVideoIDsAtState(DownloadModel.java:82)
    at sidia.rio360app.MainActivity.resumeDl(MainActivity.java:54)

SQL 中的字符串文字进入 'single quotes'。未加引号的字符串被解释为标识符,例如列名。

但是,最好使用 ? 变量并绑定值:

Cursor cursor = db.rawQuery("SELECT * FROM " + DownloadEntry.TABLE_NAME
        + " WHERE " + DownloadEntry.COLUMN_NAME_DL_STATE + " = ?", new String[] { state });