【问题标题】:android SQLiteException: no such column on custom romsandroid SQLiteException:自定义rom上没有这样的列
【发布时间】:2019-02-02 09:28:19
【问题描述】:

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

【问题讨论】:

  • 你能告诉我们CREATE TABLE声明吗?也可能值得为该用户提供一个可以list the columns of the table 的版本,这样您就可以看到该表是如何在设备上创建的。
  • 因为如果这仅在某些设备上发生并且在现有的 Android 上“正常”工作,那么您可能需要在该特定设备上进行调试。看看你住的地方附近有没有设备实验室。

标签: android android-sqlite xiaomi


【解决方案1】:

我认为这不是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();
        }
    }
}

【讨论】:

  • 我写过这不是迁移问题。我的数据库在需要时正确更新,并且在出现此错误之前很长时间没有更改此表和列。
  • @lxknvlk 听起来仍然不太可能,CREATE TABLE 会以同样的方式成功,并且查询没有什么花哨的地方,驱动程序版本会有所作为 - 除了它不提供 @987654328 @该列的值...所提供的方法应该可以解决问题,不管是什么原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多