我读了所有其他“SQLiteException没有这样的表”消息,但没有找到我的观点的答案。
我正在创建一个在数据库中有多个表的android应用程序。我一步一步建立它。 我创建了第一个表A,以及一个用于添加/编辑数据的表单。我用LoaderThrottle android示例激发了自己的灵感。它工作得很好。 在此之后,我创建了表B,就像表A一样,以及一个用于添加数据的表单。
然后我看到我忘记了表B中的字段。我尝试添加此字段并将表B切换到版本2.但是我遇到了很多问题。 “降级”和“升级”错误...... 因此,我删除了应用程序数据并从设备中卸载了应用程序,因此数据库将在首次启动时删除并重新创建。但是现在,当我启动应用程序时,我有例外<< android.database.sqlite.SQLiteException:没有这样的表:A :,编译时:SELECT name,_id FROM A WHERE((active = 1))>> ?!?
为什么dbHelper没有创建数据库?我是否必须明确调用其onCreate方法? 我是否需要为所有数据库表使用唯一的dbHelper,或者为每个表(我现在拥有的)提供一个dbHelper?
更多信息: - 在清单中,我有两个提供者,链接到每个表的内容提供者。
编辑:这是每个表的创建代码。
表A(我有例外):
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + ActivityTable.TABLE_NAME + " ("
+ ActivityTable._ID + " INTEGER PRIMARY KEY, "
+ ActivityTable.COLUMN_NAME_TITLE + " TEXT NOT NULL, "
+ ActivityTable.COLUMN_NAME_CODE + " TEXT, "
+ ActivityTable.COLUMN_NAME_ACTIVE + " smallint NOT NULL DEFAULT 1, "
+ ActivityTable.COLUMN_NAME_CPTI + " smallint NOT NULL DEFAULT 1 "
+ ");");
}
表B:
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TrackTable.TABLE_NAME + " ("
+ TrackTable._ID + " INTEGER PRIMARY KEY, "
+ TrackTable.COLUMN_NAME_DATE + " long NOT NULL, "
+ TrackTable.COLUMN_NAME_ACTIVITY_ID + " int NOT NULL DEFAULT 0, "
+ TrackTable.COLUMN_NAME_DAYPART + " smallint NOT NULL DEFAULT 0, "
+ TrackTable.COLUMN_NAME_NPQ + " smallint NOT NULL DEFAULT 0, "
+ TrackTable.COLUMN_NAME_NBPID + " long NOT NULL DEFAULT 0 "
+ ");");
}
提前感谢任何线索。 Florent的
答案 0 :(得分:1)
经过多次尝试,我终于解开了。
即使我不明白为什么必须这样做,我也会给你解决方案。 由于我的问题没有答案,有一天它可以帮助某人。
作为提醒,我从LoaderThrottle开始使用android示例。请参阅此文件。
在从SQLiteOpenHelper派生的我的子类的onCreate方法中,我改变了:
db.execSQL("CREATE TABLE " + ...
by:
db.execSQL("CREATE TABLE IF NOT EXISTS " + ...
然后,在从ContentProvider派生的子类的onCreate方法中,我直接调用DbHelper onCreate方法:
/**
* Perform provider creation.
*/
@Override
public boolean onCreate() {
mOpenHelper = new ActivityDbHelper(getContext());
// Assumes that any failures will be reported by a thrown exception.
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
mOpenHelper.onCreate(db);
return true;
}
享受, Florent的