2016-09-16 6 views
0

onUpgrade()メソッドの実行中にSQLiteデータベース内のテーブルのスキーマを更新しようとしています。私は、テーブルを削除して、新しいスキーマでそれを再作成することによって、やっている。時には、古いスキーマがこれらの2つのアクションが実行された後も持続するので、新しいテーブルを作成する前に古いテーブルを強制的に削除する方法が必要です。誰もこれを行う方法を知っていますか?SQLiteデータベースアクションを強制的に同期させるには

 database.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARMS); 
     database.execSQL(buildAlarmTable()); 

OLD SCHEMA:ここでは、コードです

private String buildAlarmTable() { 
    return "CREATE TABLE IF NOT EXISTS " + TABLE_ALARMS + 
      "(" + KEY_ALARM_ID + " INTEGER PRIMARY KEY NOT NULL," + 
      KEY_ALARM_NAME + " TEXT," + 
      KEY_ALARM_TIME + " INTEGER" + 
      ")"; 
} 

NEW SCHEMA:

public String buildAlarmTable() { 
    return "CREATE TABLE IF NOT EXISTS " + TABLE_ALARMS + 
      "(" + KEY_ALARM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
      KEY_ALARM_NAME + " TEXT," + 
      KEY_ALARM_TIME + " INTEGER," + 
      KEY_ALARM_MALID + " INTEGER" + 
      ")"; 
} 

が、私は例外を取得していますので、古いスキーマが解決しないことを知っている "KEY_ALARM_MALID" 欄後でデータベースから読み込むときには存在しません。

+1

通常、あなたはちょうど私があなたのために、同期の行動を求めているかわからないんだけど、あなたのSqliteOpenHelperクラス –

+1

にデータベースのバージョン番号を更新、しかし。 SQLiteデータベースを照会するためのIO操作はかなり同期的です。 –

+0

明確にするために、新しく作成されたTABLE_ALARMSテーブルには、新しい列を持たない古いスキーマがあることがあります。それ以外の場合は、新しいスキーマが正しく設定されます。これは、私が行動を同期的に起こっていないと思うように導く –

答えて

0

onUpgrade()を削除して再作成することは、テーブルのスキーマを更新する理想的な方法ではありません。さらに、データのすべての行が失われます。このようなALTER TABLEを使用して、古いバージョンと仮定すると1で、新しいバージョンの新しいデータベースのためのbuildAlarmTable()の新しいバージョンを保持、2

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion < 2) { 
     db.execSQL("ALTER TABLE " + TABLE_ALARMS + " ADD COLUMN " + KEY_ALARM_MALID + " int default 0;"); 
    } 
} 

そしてもちろんです。表を削除する必要がある場合

しかし、これを試してみてください。

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARMS); 
    onCreate(db); 
} 
関連する問題