我有一个由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;因此我担心/担心这样做。我尽我所能搜索,真的可以使用一些指导!在此先感谢您的帮助!
答案 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
}
}