如何强制SQLite数据库操作同步

时间:2016-09-16 18:34:44

标签: android database android-sqlite

我在onUpgrade()方法期间尝试更新SQLite数据库中表的架构。我通过删除表然后使用新架构重新创建它来做事。运行这两个操作后,有时旧模式仍然存在,因此我需要一种方法在创建新表之前强制删除旧表。有谁知道如何做到这一点?这是代码:

        database.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARMS);
        database.execSQL(buildAlarmTable());

OLD SCHEMA:

private String buildAlarmTable() {
    return "CREATE TABLE IF NOT EXISTS " + TABLE_ALARMS +
            "(" + KEY_ALARM_ID + " INTEGER PRIMARY KEY NOT NULL," +
            KEY_ALARM_NAME + " TEXT," +
            KEY_ALARM_TIME + " INTEGER" +
            ")";
}

新计划:

public String buildAlarmTable() {
    return "CREATE TABLE IF NOT EXISTS " + TABLE_ALARMS +
            "(" + KEY_ALARM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
            KEY_ALARM_NAME + " TEXT," +
            KEY_ALARM_TIME + " INTEGER," +
            KEY_ALARM_MALID + " INTEGER" +
            ")";
}

我知道旧架构仍然存在,因为我得到一个例外" KEY_ALARM_MALID"以后从数据库中读取时,列不存在。

1 个答案:

答案 0 :(得分:0)

删除表并重新创建表onUpgrade()不是更新表格架构的理想方式。另外,您将丢失所有数据行!假设旧版本为1且新版本为2,请使用ALTER TABLE

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
        db.execSQL("ALTER TABLE " + TABLE_ALARMS + " ADD COLUMN " + KEY_ALARM_MALID + " int default 0;");
    }
}

当然,请为新数据库保留新版buildAlarmTable()

但是如果你必须放弃桌子,试试这个:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARMS);
    onCreate(db);
}