如何在发布应用程序后创建新表

时间:2015-10-13 14:41:52

标签: android sqlite

在升级期间,我想在我的数据库中添加一个新表,但是我希望在升级应用程序时也不会丢失其他表中的数据。有人能告诉我,我该怎么办?

有可能吗?

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_GROUPS_TABLE);
    db.execSQL(CREATE_A_GROUPS_TABLE);
    db.execSQL(CREATE_MESSAGES_TABLE);
    db.execSQL(CREATE_REPORTING_TABLE);
    db.execSQL(CREATE_SUCC_SENDING_TABLE);
    db.execSQL(CREATE_NOTIFICATIONS_TABLE);
    db.execSQL(CREATE_RECEIVES_TABLE); // new table
}

@Override
public void onUpgrade(SQLiteDatabase db,  final int oldVersion,
                      final int newVersion) {

    db.execSQL("DROP TABLE IF EXISTS " + GROUPS);
    db.execSQL("DROP TABLE IF EXISTS " + NOTIFICATIONS);
    db.execSQL("DROP TABLE IF EXISTS " + A_GROUP);
    db.execSQL("DROP TABLE IF EXISTS " + MESSAGES);
    db.execSQL("DROP TABLE IF EXISTS " + REPORTING);
    db.execSQL("DROP TABLE IF EXISTS " + SUCC_SENDING);
    db.execSQL("DROP TABLE IF EXISTS " + RECEIVES); //new table
    onCreate(db);
}

我的新表格为RECEIVES

更新

当前版本为1。我想将其更改为2

public MainDB(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_GROUPS_TABLE);
    db.execSQL(CREATE_A_GROUPS_TABLE);
    db.execSQL(CREATE_MESSAGES_TABLE);
    db.execSQL(CREATE_REPORTING_TABLE);
    db.execSQL(CREATE_SUCC_SENDING_TABLE);
    db.execSQL(CREATE_NOTIFICATIONS_TABLE);
    //db.execSQL(CREATE_RECEIVES_TABLE); //new table
}

@Override
public void onUpgrade(SQLiteDatabase db,  final int oldVersion,
                      final int newVersion) {

    db.execSQL("DROP TABLE IF EXISTS " + GROUPS);
    db.execSQL("DROP TABLE IF EXISTS " + NOTIFICATIONS);
    db.execSQL("DROP TABLE IF EXISTS " + A_GROUP);
    db.execSQL("DROP TABLE IF EXISTS " + MESSAGES);
    db.execSQL("DROP TABLE IF EXISTS " + REPORTING);
    db.execSQL("DROP TABLE IF EXISTS " + SUCC_SENDING);
   // db.execSQL("DROP TABLE IF EXISTS " + RECEIVES); // new table
    onCreate(db);
}

2 个答案:

答案 0 :(得分:3)

每次架构更改时增加数据库版本号。

OnUpgrade方法中,检查旧版本和新版本,并编写适合从一个版本升级到另一个版本的代码。随着每个版本的发布,您可能会对版本号进行多次检查,从而可以逐步升级。从onCreate方法调用OnUpgrade是不好的做法。这应仅用于创建数据库的第一次迭代

e.g 假设当前/新版本为3

public void onUpgrade(SQLiteDatabase db,  final int oldVersion, final int newVersion) {

    if (oldversion<2) {
        // Code to upgrade from V1 to V2. 
        db.execSQL(CREATE_RECEIVES_TABLE);
    }

    if (oldversion<3) {
        // Code to upgrade from V2 to V3 
    }

    // Other version checks added as needed etc. etc

}

任何拥有V1数据库的人都会执行两个代码块。虽然V2数据库只会执行第二个数据库。添加每个版本增量的新检查。 OnUpgrade方法中的所有代码都在事务内部运行,因此如果它的任何部分失败,整个数据库将回滚到调用该方法之前的状态。

您的OnCreate方法应始终包含用于创建数据库当前\最新版本的代码。

目前,您正在删除所有表并重新创建整个数据库。这将删除所有先前创建的数据。

<强>更新 您为v2请求的具体代码是:

public MainDB(Context context) {
    super(context, DATABASE_NAME, null, 2); 
}

@Override
public void onCreate(SQLiteDatabase db) {
    // Create V2 database. This is only called if the database does not exist

    db.execSQL(CREATE_GROUPS_TABLE);
    db.execSQL(CREATE_A_GROUPS_TABLE);
    db.execSQL(CREATE_MESSAGES_TABLE);
    db.execSQL(CREATE_REPORTING_TABLE);
    db.execSQL(CREATE_SUCC_SENDING_TABLE);
    db.execSQL(CREATE_NOTIFICATIONS_TABLE);
    db.execSQL(CREATE_RECEIVES_TABLE); 
}

@Override
public void onUpgrade(SQLiteDatabase db,  final int oldVersion, final int newVersion) {

    // OnUpgrade is called if your database exists and the version number is less than the version specified in the Constructor

    if (oldversion<2) {
        // Code to upgrade from V1 to V2. 
        db.execSQL(CREATE_RECEIVES_TABLE); // Add the new table only
    }

    if (oldversion<3) {
        // When V3 is released, add code here to 
        // upgrade from V2 to V3 
    }

}

答案 1 :(得分:-1)

删除所有DROP TABLE IF EXISTS命令并放置

db.execSQL(CREATE_RECEIVES_TABLE);
在onUpgrade方法中

。就这样;

    @Override
public void onUpgrade(SQLiteDatabase db,  final int oldVersion,
                      final int newVersion) {

     db.execSQL(CREATE_RECEIVES_TABLE);
}