我看到了另一个有关使用green dao(here)进行架构升级/迁移的问题
答案中有很多链接,它们是在进行模式升级时可以使用的良好模式的方法-但是,没有任何示例说明了您对数据进行实际操作以正确迁移数据的过程,而我却很难找到任何东西。
就我而言,我的迁移非常简单-我不希望转换任何现有数据,我只需要向架构中添加一些新表,我怀疑这是相当普遍的情况。
在不删除用户已经保存的数据的情况下,将新表添加到架构的最简单方法是什么?一个具体的例子将不胜感激。
如果greenDao提供了一个类似于DevOpenHelper的类,那将非常棒,该类将简单地添加模式中以前不存在的新表/列,而无需先删除现有的表/数据。
最佳答案
我终于有时间自己研究这个问题,并且意识到在保留旧表中的数据的同时添加新表非常容易。
免责声明:尽管我意识到此实现特定于我的场景,但对于像我这样专门使用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”是否是您要从中升级的版本,然后仅对“new”表调用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 create语句并利用它们。
要将单个新列(NEW_COLUMN,假设它是INTEGER类型)添加到现有表(EXISTING_TABLE)中,请执行以下操作:
db.execSQL("ALTER TABLE 'EXISTING_TABLE' ADD 'NEW_COLUMN' INTEGER");
现在对我来说,我需要做的就是添加新的Tables,因此最终很简单。希望其他人觉得这很有用。
关于android - greenDao架构升级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16154113/