[英]Updating sqlite database versions?
我有一个数据库,我想添加一个列,我更改了静态数据库版本,但是当我在我的设备上运行程序时,新列仍然没有,所以我猜我的onUpdate
没有被调用,我不确定为什么。
这就是我创建数据库的方式
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
createTables(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion)
{
Log.w("CalendarDB", "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS Events_Table");
onCreate(db);
}
private void createTables(SQLiteDatabase db){
db.execSQL("CREATE TABLE " + EVENTS_TABLE + "(" + ID + " integer primary key autoincrement, " +
EVENT + " TEXT, " + LOCATION + " TEXT, " + DESCRIPTION + " TEXT, " + DATE + " TEXT, " + START + " LONG, " + END + " TEXT, " + REAL_START_TIME + " TEXT,"
+ REAL_END_TIME + " TEXT," + COLOR + " TEXT, " + BLINK + " TEXT, " + VIBRATE + " TEXT, " + RING_TONE_PATH + " TEXT, " + ICON + " TEXT, " + REMINDERS +
" TEXT, " + START_WITH_REMINDER + " TEXT, " + CALENDAR_ID + " TEXT, " + EVENT_ID + " TEXT);");
}
}
还有什么我需要做的才能让onUpdate
被调用吗? 我尝试了这个答案,但仍然没有结果
为了在Android中升级数据库,您应该将DATABASE_VERSION增加1,以便SQLOpenHelper知道它必须调用onUpgrade方法。
Rembember
这仅在您调用getWritableDatabase()时有效,否则将无法升级。 如果您更改版本并调用getReadableDatabase,它将显示异常
throw new SQLiteException("Can't upgrade read-only database from version " +
db.getVersion() + " to " + mNewVersion + ": " + path);
但为什么? 你看到当你调用getWritableDatabase代码时检查版本是否相同:
if (version != mNewVersion) {
db.beginTransaction();
try {
if (version == 0) {
onCreate(db);
} else {
if (version > mNewVersion) {
onDowngrade(db, version, mNewVersion);
} else {
onUpgrade(db, version, mNewVersion);
}
}
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
更新
事实证明它应该与getReadableDatabase()一起使用,因为在代码中你总是得到一个WrittableDatabase。 所以它应该适用于这两种方法,这里是getReadableDatabase()的文档:
创建和/或打开数据库。 这将是getWritableDatabase()返回的同一对象,除非某些问题(例如完整磁盘)要求以只读方式打开数据库。 在这种情况下,将返回只读数据库对象。 如果问题得到解决,将来可能会调用getWritableDatabase(),在这种情况下,将关闭只读数据库对象,并在将来返回读/写对象。
我建议你将DATABASE_VERSION
增加1,这将导致应用程序调用onUpgrade()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.