在升级期间,我想在我的数据库中添加一个新表,但是我希望在升级应用程序时也不会丢失其他表中的数据。有人能告诉我,我该怎么办?
有可能吗?
@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);
}
答案 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);
}