2016-08-29 10 views
0

ORMLiteを使用しています。新しいバージョンをリリースします。 これのために私はこのようなDBアップグレードスクリプト(json)を持っています。DBアップグレード中にORMLiteに存在しない場合、新しい列を作成する方法

{ 
    "version": 9, 
    "ddlQueries": [ 
    { 
     "queryDescription": "add a new column column name in tablename table", 
     "commandType": "ALTER", 
     "table": "table name", 
     "column": { 
     "name": "column name", 
     "type": "BLOB" 
     } 
    }, 
    { 
     "queryDescription": "Create a new column column name in table name table", 
     "commandType": "ALTER", 
     "table": "table name", 
     "column": { 
     "name": "column name", 
     "type": "TEXT" 
     } 
    } 
    ] 
} 

このような私のonUpgradeメソッド。

public void onUpgrade(Object db, ConnectionSource connectionSource, int oldVersion, int newVersion) { 
     try { 
      while(++oldVersion<=newVersion) { 
       AssetManager assetManager = context.getAssets(); 
       InputStream inputStream = assetManager.open(MIGRATION_SCRIPT_PATH + "version-" + oldVersion + ".json"); 
       List<String> queries = new QueryBuilder().loadQueries(new InputStreamReader(inputStream)); 
       inputStream.close(); 
       for (String sql : queries) { 
        executeSQL(db, sql); 
       } 
       postUpgrade(db, connectionSource, oldVersion); 
      } 
     } catch (IOException e) { 
      Log.e(AccountsDBHelper.class.getName(), "exception during onUpgrade", e); 
      //Below exception must be thrown to rollback changes. 
      throw new RuntimeException(e); 
     } 
    } 

は今、私はその後、存在しない場合は唯一の私は、新しい列を作成したい、列が既に存在するかどうかを確認したいそうでない場合は無視します。

どうすればいいですか?

ありがとうございました。

答えて

1

この段階で既存の列をチェックできるかどうかはわかりませんが、この問題の回避策があります。

ここに私の回避策があります!

public void onUpgrade(Object db, ConnectionSource connectionSource, int oldVersion, int newVersion) { 
     try { 
      while(++oldVersion<=newVersion) { 
       if(oldVersion == 9) { 
        Cursor cursor = rawQuery(db,"PRAGMA table_info(TABLE_NAME)",null); 
        int count = cursor.getCount(); 
        if(count > 0){ 
         boolean isColumn1Available = false; 
         boolean isColumn2Available = false; 
         while (cursor.moveToNext()) { 
          String columnName = cursor.getString(1); 
          if(columnName.equals("column1")) 
           isColumn1Available = true; 
          if(columnName.equals("column2")) 
           isColumn2Available = true; 

         } 
         //Here I want to skip if columns are already created 
         if(isColumn1Available && isColumn2Available) 
          return; 
        } 
       } 
       AssetManager assetManager = context.getAssets(); 
       InputStream inputStream = assetManager.open(MIGRATION_SCRIPT_PATH + "version-" + oldVersion + ".json"); 
       List<String> queries = new QueryBuilder().loadQueries(new InputStreamReader(inputStream)); 
       inputStream.close(); 
       for (String sql : queries) { 
        executeSQL(db, sql); 
       } 

      } 
     } catch (IOException e) { 
      Log.e(AccountsDBHelper.class.getName(), "exception during onUpgrade", e); 
      //Below exception must be thrown to rollback changes. 
      throw new RuntimeException(e); 
     } 
    } 

ありがとうございました。

関連する問題