升级现有Android数据库的步骤没有丢失数据

时间:2015-01-19 16:23:26

标签: android database

我有一个由Beta测试人员使用的应用程序。我原来的架构并没有最终用于我目前正在处理的功能的实际实现。我想更新数据库。我不希望我的测试人员丢失他们的数据。

我的理解是这样做的步骤是:

1)保留我的SQLiteOpenHelper类onCreate方法AS IS 。我保留它,因为它是目前/最初编写的,"版本1"我想起了架构。

更新2015-04-19:第一步是错误的。有关详细信息,请参阅下面的我自己的(已接受的)答案。

2)填写我的SQLiteOpenHelper类onUpgrade方法。这里我将所有更改从第一个模式转到第二个模式。 (并且将来可能会写出从第二个模式到第三个模式所需的更改)

3)更新数据库版本。在我的应用程序中,我将其保留为静态var。当我准备好拉动触发器并更新数据库时,我将此var(DB_VERSION)从1更改为2.对于安装在版本为1的设备上的应用程序,此变量为2是触发onUpgrade()的内容在第一次打开数据库时调用(在我的例子中,应用程序是onCreate)。

public static final int DB_VERSION = 1;

...

class DBHelper extends SQLiteOpenHelper {

    public DBHelper() {
        super(context, DB_NAME, null, DB_VERSION);
    }

4)运行我的应用并交叉手指。如果我在SQL中收到错误/输入错误,我会卸载并再次运行。

任何人都可以验证这是否正确?或者,如果我忽视某些事情?

我找到的教程 - 当他们不删除并重新创建数据库时,将onCreate更改为新模式 - 当你已经拥有一个应用程序时,不要真正讨论需要做出改变。我想它与初学者无关,并且假设非初学者的知识?对于无法丢弃用户数据的升级,我只能找到有关升级的单个方面的具体问题/答案,而不是全面的指南。我担心我可能会遗漏一些非常基本/重要的东西,以至于它不用说#34;因此我担心/担心这样做。我尽我所能搜索,真的可以使用一些指导!在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

这是正确的。您正在增加版本并更新数据库。

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if(oldVersion < 2) {
        db.execSQL("blablabla");
    }
    if(oldVersion < 3) {
        db.execSQL("new blablabla");
    }
    if(oldVersion < 4) {
        db.execSQL("newest blablabla");
    }
}

答案 1 :(得分:0)

   > Can anyone verify if that is correct?

这就是我的Android应用程序的工作方式。我的代码如下所示:

public class DatabaseHelper extends SQLiteOpenHelper {
    public static final int DATABASE_VERSION_3_MYTABLE_WITH_NOTES = 3;
    public static final int DATABASE_VERSION_4_CATEGORY_ACTIVE = 4;
    public static final int DATABASE_VERSION_5_REPORT_VIEW = 5;

    // points to latest version
    public static final int DATABASE_VERSION = DatabaseHelper.DATABASE_VERSION_5_REPORT_VIEW;

    public DatabaseHelper(final Context context, final String databaseName) {
        super(context, databaseName, null, DatabaseHelper.DATABASE_VERSION);
        ....
    }

    @Override
    public void onUpgrade(final SQLiteDatabase db, final int oldVersion,
                          final int newVersion) {
        Log.w(this.getClass().toString(), "Upgrading database from version "
                + oldVersion + " to " + newVersion + ". (Old data is kept.)");
        if (oldVersion < DatabaseHelper.DATABASE_VERSION_3_MYTABLE_WITH_NOTES) {
            this.version3Upgrade_MYTABLE_WITH_NOTES(db);
        }
        if (oldVersion < DatabaseHelper.DATABASE_VERSION_4_CATEGORY_ACTIVE) {
            this.version4Upgrade_CATEGORY_ACTIVE(db);
        }
        if (oldVersion < DatabaseHelper.DATABASE_VERSION_5_REPORT_VIEW) {
            this.version5Upgrade_REPORT_VIEW(db);
        }
    }

    private void version3Upgrade_MYTABLE_WITH_NOTES(final SQLiteDatabase db) {
        // added MYTABLE.notes
        db.execSQL("ALTER TABLE " + MyTable.TABLE
                + " ADD COLUMN " + MyTable.COL_NOTES + " TEXT");
    }

我有一个const和一个方法可以从一个版本升级到下一个版本。

答案 2 :(得分:-2)

对不起3个月前的自我,结果发现错了!

问题出在第一步。 onCreate不会保留原样。它需要创建最新版本的数据库。仅当EXISTING用户更新到最新的应用程序版本时才会调用onUpdate。任何进行CLEAN INSTALL的人最终会使用旧方案,而不会调用onUpdate。

这是我的新代码的框架,它似乎可以处理干净的安装和升级。 (至少我希望如此。)

class DBHelper extends SQLiteOpenHelper {

    public DBHelper() {
        super(context, DB_NAME, null, DB_VERSION);
        Log.i(TAG, "DBHelper called with DB_NAME " + DB_NAME + " and DB_VERSION " + Integer.toString(DB_VERSION));
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        setupV1(db);
        upgradeV2(db);
    }


    @Override
    public void onUpgrade(
            final SQLiteDatabase db, final int oldVersion,
            final int newVersion)
        {
            int upgradeTo = oldVersion + 1;
            Log.i(TAG, "Upgrading database to version " + Integer.toString(upgradeTo));
            while (upgradeTo <= newVersion)
            {
                switch (upgradeTo)
                {
                    // Database v2. Added X Functionality
                    case 2:
                        upgradeV2(db);
                        break;
                    // Database v3 (not created yet)
//                      case 3:
//                          // something here
//                          break;
                }
                upgradeTo++;
            }
        }

    private void setupV1(final SQLiteDatabase db) {
        // CODE HERE TO CREATE VERSION / SCHEMA ONE OF MY DATABASE
    }

    private void upgradeV2(final SQLiteDatabase db) {
        // CODE HERE TO UPDATE FROM VERSION ONE TO VERSION TWO
    }

}