android SQLiteException:自定义rom上没有这样的列

时间:2019-02-02 09:28:19

标签: android android-sqlite xiaomi

在具有修改的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%发生。很奇怪。也许有一种方法可以在创建数据库后检查数据库的完整性,然后重新创建带有错误的表?

1 个答案:

答案 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();
        }
    }
}