1

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

4

1 回答 1

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();
        }
    }
}
于 2019-02-02T12:40:55.017 回答