在具有修改的android版本的设备上,出现此错误。例如在小米设备上。
String query = "select * from dialogues where userId = ? and topChat = 0 order by updatedAtByClient desc";
Cursor dialogRes = db.rawQuery(query, new String[]{userId});
我在这里得到例外:
android.database.sqlite.SQLiteException: no such column: topChat (code 1):,
while compiling: select * from dialogues where userId = ? and topChat = 0
order by updatedAtByClient desc
我手动编写了异常消息,因为用户在屏幕截图中向我发送了异常消息,因此可能会有错别字。
该如何解决?为什么会发生?
UPD1: create table语句类似于以下内容:
"CREATE TABLE IF NOT EXISTS dialogues(fieldName VARCHAR, camelCaseFieldName VARCHAR,
topChat INTEGER, createdAt DATE);";
当我更改数据库结构时,我有一个正确实现的更新方法,但是这个特定的表和字段名称很长时间没有更改。
UPD2: 我已经为有问题的用户制作了一个APK,记录了该表的列,并且确实在日志中看到了有问题的列,并且用户说此版本可以正常工作。
因此,似乎该错误不会100%发生。很奇怪。也许有一种方法可以在创建数据库后检查数据库的完整性,然后重新创建带有错误的表?
答案 0 :(得分:0)
我认为这不会是xiaomi
的问题。相反,这似乎是不幸的迁移的结果,在该迁移中未添加新列,因此用户仍可以使用该表的先前版本。并且对于缺少的列没有其他逻辑上的解释),仅仅是因为CREATE TABLE
语句有效-或无效。
仍然可以使用ALTER TABLE
解决它。例如。当发生SQLiteException
时,addColumnIfNotExists("dialogues", "topChat", "INTEGER DEFAULT 0");
...为了不因为删除表而不会造成数据丢失,仅仅是因为它缺少一些列。
public void addColumnIfNotExists(String tableName, String columnName, String dataType) {
Cursor cursor = null;
try {
cursor = db.rawQuery("SELECT * FROM " + tableName, null);
if(! Arrays.asList(cursor.getColumnNames()).contains(columnName)) {
db.execSQL(String.format("ALTER TABLE %s ADD COLUMN %s %s", tableName, columnName, dataType));
}
} finally {
if(cursor != null) {
cursor.close();
}
}
}