如何在不必每次卸载APK的情况下对数据库进行更改?

时间:2016-12-14 09:33:50

标签: android sqlite

public class ProjectConstants {
    public static final String myDbName = "ContactsDatabase.db";
    public static final String myTableName = "ContactDetails";
   // public static final String myTableName = "ContactDetails1";
    public static final String nameColumn = "ContactName";
    public static final String numberColumn = "ContactNumber";
}

首先,我使用表名创建联系人应用程序: ContactDetails 然后,我对该数据库表执行所有添加,编辑和删除操作。假设我在该数据库表中有15个名为 ContactDetails 的联系人详细信息。

现在在上面的代码片段中,我进行了2次更改: 我评论这一行

//public static final String myTableName = "ContactDetails";

我取消注释这一行

public static final String myTableName = "ContactDetails1";

现在,如果我运行代码,应用程序崩溃。

我从Stack Overflow中学到的东西粗略地教会了我两件事要思考

1

  

请记得卸载并重新安装您的应用,以便onCreate   再次调用method并重新创建数据库。

2

  

如果是第一次创建数据库,则onCreate方法是   在helper类中调用,否则调用onUpgrade。

我扩展SQLiteOpenHelper类的子类看起来像这样,

public class DBHelper extends SQLiteOpenHelper {

    private static final String TEXT_TYPE = " TEXT";
    private static final String COMMA_SEP = ",";
    private static final String SQLCreateEntries =
            "CREATE TABLE " + ProjectConstants.myTableName + " (" +
                    ProjectConstants.nameColumn + TEXT_TYPE + COMMA_SEP +
                    ProjectConstants.numberColumn + TEXT_TYPE + " )";
    private static final String SQLDeleteEntries = "DROP TABLE IF EXISTS " + ProjectConstants.myTableName;

    public DBHelper(Context context) {
        super(context, String.valueOf(name), null, version);
    }


    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(SQLCreateEntries);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL(SQLDeleteEntries);
        onCreate(sqLiteDatabase);
    }

现在,如果我每次弄乱数据库时卸载并重新安装应用程序,都会按照第一个引用块中的说明进行操作,那么应用程序永远不会崩溃。 但是,如果我恢复到原始数据库(然后我执行此卸载并重新安装应用程序),显然我的数据库中的数据不再存在。

如上所述,名为“ContactDetails”的数据库表拥有15个联系人,现在不再拥有该数据。

但我希望15个联系人在我的数据库表格中保持完整“ContactDetails”

无论如何都要对数据库进行更改而不必卸载重新安装apk而不丢失以前的数据?

1 个答案:

答案 0 :(得分:1)

您已在Helper类的OnUpgrade()上编写SQL命令并使用不同版本的代码执行SQL命令块,如下所示:

@Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL(SQLDeleteEntries);
        onCreate(sqLiteDatabase);
        switch(i){
           case 1:
               <commands for version 1>
               break;
           case 2:
                <commands for version 2>
                break;
    }

您可以根据应用程序版本编写swich案例。您可以编写不同的SQL命令块,以便在不同版本的应用程序上执行。