我公司内部应用程序的用户未运行sqlite查询时出现了奇怪的问题。它崩溃并显示以下错误:
android.database.sqlite.SQLiteException: no such column: intCol3 (code 1 SQLITE_ERROR): , while compiling: SELECT primaryKey, intCol1, textCol1, intCol2, textCol2, textCol3, intCol3 FROM table WHERE intCol4='1' LIMIT 100
intCol3
和intCol4
是针对我要安装的新版本添加到此表的新列。但是,如果我删除了intCol3
,则intCol4
出现了错误,并且如果我也删除了它,则primaryKey出现了问题。
最初,我认为这与他是唯一在手机上安装了android 9的用户有关,但是在其他android 9设备上尝试使用它时,效果很好。他似乎是第二次将自己的Google帐户链接到该查询中断的设备。
我尝试重新安装应用程序并清除所有应用程序数据以及所有缓存到他手机中的内容,但仍然会引发此异常。
我还尝试添加到代码中,以尝试在他每次尝试登录时创建“缺少”列,但这并没有什么不同。
有没有人遇到过类似现象或能够向我指出正确的方向?
这是我的onCreate
和onUpgrade
@Override
public void onCreate(SQLiteDatabase db) {
try {
createTables();
} catch (Exception e) {
Log.d("Error:","Failied to build tables:" + e);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.v("*! dbHelper upgrade", "Update contacts");
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
public void createTables() {
SQLiteDatabase db = this.getWritableDatabase();
Log.v("*! dbHelper create", "Create contacts");
db.execSQL(
"create table contacts " +
"(cnId integer primary key, cnName text, cnDate date)"
);
db.execSQL(
"create table parts " +
"(primaryKey integer primary key, intCol1 integer, textCol1 text, intCol2 integer, textCol2 text, textCol3 text, intCol3 integer, intCol4 integer)"
);
}
答案 0 :(得分:2)
两个问题:
您的createTables()
呼叫getWritableDatabase()
。您不能这样做-导致“递归调用”异常。请使用SQLiteDatabase
作为参数传递给onCreate()
。
您的onCreate()
吞噬了该异常。由于onCreate()
正常返回,因此框架认为数据库设置成功。您需要让SQLiteOpenHelper
中出现异常。