我终于有时间自己深入研究这一点,并意识到在旧表中保留数据的同时添加新表非常容易。
免责声明:虽然我意识到这个实现是针对我的场景的,但我认为它对像我这样专门使用 Android ORM 工具 (greenDao) 来处理 Android 上的 SQLite 的人很有帮助。我知道这对于那些从一开始就编写自己的表创建查询的人来说是很常见的,但是对于那些没有在 Android 上使用 SQLite DB 的胆量的人来说,我认为这个示例会有所帮助。
解答:
您可以修改 DevOpenHelper 内部类或创建自己的类。我暂时选择编辑 DevOpenHelper 以保持我的示例简单 - 但是,请注意,如果您重新生成 greendao 类,DevOpenHelper 将被覆盖。创建自己的类(如“MyOpenHelper”)并改用它会是一个更好的主意。
在我进行更改之前,DevOpenHelper.onUpgrade 看起来像这样:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
dropAllTables(db, true);
onCreate(db);
}
不要删除所有表,而是看一下 GreenDao 自动生成的 createAllTables 方法。
重写 onUpgrade 以检查“oldVersion”是否是您要升级的版本,然后只为“新”表调用 createTable 方法。这是我的 onUpgrade 方法现在的样子:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " +
//Going from older schema to new schema
if(oldVersion == 3 && newVersion == 4)
{
boolean ifNotExists = false;
//Leave old tables alone and only create ones that didn't exist
//in the previous schema
NewTable1Dao.createTable(db, ifNotExists);
NewTable2Dao.createTable(db, ifNotExists);
NewTable3Dao.createTable(db, ifNotExists);
NewTable4Dao.createTable(db, ifNotExists);
}
else
{
dropAllTables(db, true);
onCreate(db);
}
}
添加一个新列将是类似的,除了您必须编写一些 SQL 或查看 greenDao 自动生成的 SQL 创建语句并利用这些语句。
要将单个新列(NEW_COLUMN,假设它是 INTEGER 类型)添加到现有表 (EXISTING_TABLE),请执行以下操作:
db.execSQL("ALTER TABLE 'EXISTING_TABLE' ADD 'NEW_COLUMN' INTEGER");
现在对我来说,我需要做的就是添加新表格,所以这最终变得相当简单。希望其他人觉得这很有用。