SQLite 数据库在已验证的现有列上"No such column"错误



我卡住了"SQLiteException: no such column; "错误。我试图做一些代码来检查是否一个项目存在于数据库之前存储它,我不知道它是否是最好的方式,但它做的工作。或者不完全是,当我在搜索的特定列中使用所有数字时,它工作得很好。但是如果列数据中有任何字母,它就会崩溃。

MainActivity

private ConversationsDatabaseHelper db;
//onCreate stuff here
db = new ConversationsDatabaseHelper(this);
String threadId = "886";
Log.d(TAG, "dbTest: EXISTS; " + db.conversationExists(threadId));

和databaseHelper类中的converonexists函数

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。在这种情况下,我并没有那么虚伪。堆栈跟踪…

印度生物技术部:存在;假

,但是使用a886会得到

由于:android.database.sqlite.SQLiteException: no such column: a886 (code 1 SQLITE_ERROR):,编译时:SELECT * FROM conversations 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"
+ ")";

我"creek"如有任何帮助,我将不胜感激。

值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是为您构建的。

它看起来像字母和数字混合可能部分原因但不应列是文本数据类型创建的。

SQlite在存储任何类型的值时都没有问题。类型本身实际上可以是任何类型(规则用于确定结果类型),它只是要存储的值的指示。唯一的例外是行id或行id的别名必须是整数值(id列是行id列的别名)

相关内容

最新更新