2015-10-13 45 views
0

在升级期间,我想向我的数据库添加一个新表,但是我还希望在升级应用程序时不会丢失其他表中的数据。有人可以告诉我,我该怎么办?如何在发布应用程序后创建新表

有可能吗?

@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); 
} 

回答

3

每当模式更改时增加数据库版本号。

OnUpgrade方法中,检查旧版本和新版本,并编写适合从一个版本升级到另一个版本的代码。在发布每个版本时,您可能会对版本号进行多次检查,从而允许您逐步升级。从OnUpgrade方法中拨打onCreate并不是一个好习惯。这应该只用于创建数据库

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方法应始终包含用于创建数据库的当前\ latest版本的代码。

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

更新 您的V2要求的具体代码如下:当`OnUpgrade`方法调用`OnCreate`方法

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 
    } 

} 
+0

我更新了我的问题。 PLZ给我正确的代码。非常感谢。 'RECEIVES'是新表。 –

+0

这已经是正确的。它只是有额外的信息,当你想更新到V3 – Kuffs

+0

好,但当我更改版本代码为2时,其他表的所有数据将被删除。我不想丢失我的数据。 –

-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); 
} 
+1

这可能会抛出一个错误,因为它会试图创建表已经存在。 – Kuffs

+0

因为onCreate没有被调用,所以它不会被升级。 onUpgrade是..并且如果onUpgrade被调用,那么db.execSQL(CREATE_RECEIVES_TABLE);没有被调用(假设不在你以前的版本中),如果数据库版本号增加并且人们拥有旧的数据库版本,则只会调用onUpgrade而不是onCreate。您仍然需要onCreate中的创建接收表,供未升级的用户直接下载您的应用的第2版。 – vguzzi

+0

您正在使用onupgrade方法专门调用oncreate,因此它将被称为 – Kuffs

相关问题