我想为dbflow(v4 +)编写一个迁移脚本..我想删除所有以前的表,然后从头开始构建所有内容。目前只有我发现我们可以这样做的方式如下:
@Migration(version = 2, database = AppDatabase.class)
public static class Migration2 extends BaseMigration {
@Override
public void migrate(DatabaseWrapper database) {
ArrayList<ModelAdapter> modelAdapters = new ArrayList<>();
// Old tables
modelAdapters.add(FlowManager.getModelAdapter(Events.class));
modelAdapters.add(FlowManager.getModelAdapter(Notes.class));
// New table
modelAdapters.add(FlowManager.getModelAdapter(User.class));
for (ModelAdapter modelAdapter : modelAdapters) {
database.execSQL("DROP TABLE IF EXISTS " + modelAdapter.getTableName());
database.execSQL(modelAdapter.getCreationQuery());
}
}
}
我不喜欢这种方法,因为我们必须手动提及所有旧表和新表。有没有更好的方法来做到这一点。我的数据库发生了重大变化,因此丢弃所有表似乎是唯一的选择。
答案 0 :(得分:0)
您可以使用属性文件并在该文件中编写drop语句。 然后,创建一个使用以下函数的类来动态加载文件并执行其中的所有语句。您还可以使用其他文件动态创建数据库中的所有表。
public void createTable() {
try {
SQLiteDatabase sqLiteDBConn = SQLLiteDBUtility.getHelper(context).getWritableDatabase();
InputStream inputStream = assetManager
.open("deletetable.properties");
Properties properties = new Properties();
properties.load(inputStream);
Enumeration<?> propertyKeys = properties.propertyNames();
while (propertyKeys.hasMoreElements()) {
String key = (String) propertyKeys.nextElement();
String strDeleteStatement = properties
.getProperty(key);
sqLiteDBConn.execSQL(strCreateStatement);
}
} catch (Exception e) {
Log.e("Exception", e.getMessage(), e);
}
}
在包含创建表命令的资产中放置的样本属性文件:
client_data.create_table = create table if not exists client_data("db_name" TEXT PRIMARY KEY NOT NULL, "db_password" TEXT DEFAULT 'F')
对于数据库升级,您可以创建一个类,然后将其扩展到SQLiteOpenHelper,然后再使用OnUpgrade方法并执行新数据库版本的语句。例如:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
SQLDBUpgradeUtils sqlStatementsUtil = new SQLDBUpgradeUtils ();
sqlStatementsUtil.executeStatement(db, oldVersion);
}
在SQLDBUpgradeUtils中,您可以使用以下内容:
public void executeStatement(SQLiteDatabase db, int oldVersion) {
DataLoaderUtility dataLoaderUtility = new DataLoaderUtility();
if(oldversion < PresentDBVersion){
String alterTable = "ALTER TABLE client_data ADD location TEXT"
}
}