我被困在“SQLiteException:沒有這樣的列:”錯誤上。我正在嘗試撰寫一些代碼來在存盤之前檢查資料庫中是否存在某個專案,我不知道這是否是最好的方法,但它可以完成作業。或者不是真的,當我使用所有數字作為我正在搜索的特定列中的資料時,它作業正常。但是如果列資料中有任何字母,它就會崩潰。
主要活動
private ConversationsDatabaseHelper db;
//onCreate stuff here
db = new ConversationsDatabaseHelper(this);
String threadId = "886";
Log.d(TAG, "dbTest: EXISTS; " db.conversationExists(threadId));
在 databaseHelper 類中是 converstionExists 函式
public boolean conversationExists(String threadId) {
// Select All Query
String selectQuery = "SELECT * FROM " Conversations.TABLE_NAME " WHERE "
Conversations.COLUMN_THREAD_ID " LIKE " threadId;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
boolean returnValue = false;
// Check if this message exists
if (cursor.moveToFirst()) {
returnValue = true;
}
// close db connection
db.close();
return returnValue;
}
因此,如果我使用例如“886”作為 threadId 值,那么一切都很好。如果我創建具有匹配 threadId 的行,則它回傳 true。在這種情況下,我沒有那么錯誤。堆疊跟蹤...
dbTest:存在;錯誤的
但使用 a886 結果
引起:android.database.sqlite.SQLiteException:沒有這樣的列:a886(代碼1 SQLITE_ERROR):,編譯時:SELECT * FROM對話WHERE thread_id LIKE a886
和 88a6 導致這個
Caused by: android.database.sqlite.SQLiteException: unrecognized token: "88a6" (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM conversations WHERE thread_id LIKE 88a6
看起來混合字母和數字可能是這里的部??分原因,但不應該是因為該列是為保存 TEXT 資料型別而創建的。這是資料庫創建表查詢字串。
public static final String TABLE_NAME = "conversations";
public static final String COLUMN_ID = "id";
public static final String COLUMN__ID = "_id";
public static final String COLUMN_GROUP_ID = "group_id";
public static final String COLUMN_LAST_MESSAGE_ID = "last_message_id";
public static final String COLUMN_THREAD_ID = "thread_id";
public static final String COLUMN_ADDRESS = "address";
public static final String COLUMN_CONTACT = "contact";
public static final String COLUMN_BODY = "body";
public static final String COLUMN_DATE = "date";
public static final String COLUMN_TYPE = "type";
public static final String COLUMN_STATE = "state";
public static final String COLUMN_READ = "read";
public static final String COLUMN_STATUS = "status";
public static final String COLUMN_CT = "ct";
// Create table SQL query
public static final String CREATE_TABLE =
"CREATE TABLE " TABLE_NAME "("
COLUMN_ID " INTEGER PRIMARY KEY ,"
COLUMN_LAST_MESSAGE_ID " TEXT,"
COLUMN__ID " TEXT,"
COLUMN_GROUP_ID " TEXT,"
COLUMN_THREAD_ID " TEXT,"
COLUMN_ADDRESS " TEXT,"
COLUMN_CONTACT " TEXT,"
COLUMN_BODY " TEXT,"
COLUMN_DATE " TEXT,"
COLUMN_TYPE " TEXT,"
COLUMN_STATE " TEXT,"
COLUMN_READ " TEXT,"
COLUMN_STATUS " TEXT,"
COLUMN_CT " TEXT"
")";
我對此感到“順水推舟”,任何幫助將不勝感激。
uj5u.com熱心網友回復:
值 a886 應該是文本/字串文字而不是數字文字。因此,它應該用單引號括起來。錯誤是因為:-
a886 失敗,沒有找到任何列,因為它被視為列名,因為它不是文字。
而 88a6 首先不是有效的文字(由于 a),因此是列名,但隨后是無效的列(除非包含在內,否則不能以數字開頭)名稱,因此不是已知標記。
請參閱文字值(常量)
您可以使用(將 threadId 括在單引號中)解決此問題:-
String selectQuery = "SELECT * FROM " Conversations.TABLE_NAME " WHERE "
Conversations.COLUMN_THREAD_ID " LIKE '" threadId "'";
但是,建議使用系結引數來防止 SQL 注入。
因此,建議使用:-
String selectQuery = "SELECT * FROM " Conversations.TABLE_NAME " WHERE "
Conversations.COLUMN_THREAD_ID " LIKE ?";
隨著 :-
Cursor cursor = db.rawQuery(selectQuery, new String[]{threadId});
- 即?由正確封閉的 threadId 值替換。
您可能希望考慮使用便捷查詢方法而不是 rawQuery,這將是:-
Cursor cursor = db.query(Conversations.TABLE_NAME,null,Conversations.COLUMN_THREAD_ID " LIKE ?", new String[]{theadId},null,null, null);
- SQL 是為您構建的。
看起來混合字母和數字可能是這里的部??分原因,但不應該是因為該列是為保存 TEXT 資料型別而創建的。
SQlite 以任何型別存盤任何值都沒有問題。型別本身實際上可以是任何東西(規則用于確定結果型別),它只是將存盤的值的指示。唯一的例外是 rowid 或 rowid 的別名必須是整數值(您的 id 列是 rowid 列的別名)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/310824.html
上一篇:如何從Java8中的流中獲取Map<String,List<Object>>
下一篇:最有效的演算法和BigO符號
