2017-06-22 157 views
0

我想为dbflow(v4 +)编写一个迁移脚本。我想删除所有先前的表,然后从头开始构建所有内容。目前,只有我发现,我们可以做到这一点的方法是这样的:删除所有旧表并在dbflow中重新创建表

@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()); 
     } 
    } 
} 

我不喜欢这种方法,但正如我们不得不手动提所有的新老表。有没有更好的方法来做到这一点。我的db已经发生了很大的变化,因此删除所有表似乎是唯一的选择。

回答

0

您可以使用属性文件并在该文件中写入drop语句。 然后,创建一个使用下面的函数来动态加载文件并执行其中的所有语句的类。您也可以使用其他文件来动态创建数据库中的所有表格。存放到资产含CREATE TABLE

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然后ovveride的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" 
} 
     } 
+0

但有一个更简单的方法做到这dbFlow? –

相关问题