【问题标题】:How to make changes to the database without having to uninstall APK every time?如何在不必每次都卸载 APK 的情况下对数据库进行更改?
【发布时间】:2016-12-14 18:07:09
【问题描述】:
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 然后我对该数据库表执行所有添加、编辑和删除操作。假设我在名为 ContactDetails 的数据库表中有 15 个联系方式。

现在在上面的代码 sn-p 中我做了 2 处更改: 我评论了这一行

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

我取消注释这一行

public static final String myTableName = "ContactDetails1";

现在如果我运行代码,应用就会崩溃。

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

1.

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

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并且不会丢失以前的数据?

【问题讨论】:

    标签: android sqlite


    【解决方案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;
        }
    

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

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      相关资源
      最近更新 更多