のonUpgrade
メソッドはSQLiteOpenHelper
これまでに呼び出されましたか?もしそうなら、それはいつ、何によって呼ばれますか?開発者から呼び出されていない場合、なぜそこにあるのでしょうか。その機能で実際に何が起こりますか?すべてのテーブルを削除する例を見てきましたが、コメントには、すべてのテーブルを削除することはあなたがすべきことではないというものがあります。助言がありますか?
6 に答える
が呼び出された正確な瞬間を知りたい場合は、またはonUpgrade()
への呼び出し中です。getReadableDatabase()
getWriteableDatabase()
確実にトリガーされる方法がわからない人への答えは次のとおりです。コンストラクターに提供されたデータベースのバージョンSqLiteOpenHelper
が更新されたときにトリガーされます。ここに例があります
public class dbSchemaHelper extends SQLiteOpenHelper {
private String sql;
private final String D_TAG = "FundExpense";
//update this to get onUpgrade() method of sqliteopenhelper class called
static final int DB_VERSION = 2;
static final String DB_NAME = "fundExpenseManager";
public dbSchemaHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
// TODO Auto-generated constructor stub
}
今から... onUpgrade()
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
sql = "ALTER TABLE " + fundExpenseSchema.Expense.TABLE_NAME + " ADD COLUMN " + fundExpenseSchema.Expense.FUNDID + " INTEGER";
arg0.execSQL(sql);
}
SQLiteOpenHelper を使用している場合、DB バージョンを変更するたびに onUpgrade が呼び出されます。これが機能するには、追加の要件があります。データベース名は同じままにする必要があります。
Old Version:
dbName = "mydb.db"
dbVersion = 1
New Version:
dbName = "mydb.db"
dbVersion = 2
コンテンツ プロバイダーの onCreate で、これらのパラメーターを受け取る SQLiteOpenHelper のインスタンスを作成します。SQLiteOpenHelper の実装は次のようになります。
public static final class MySQLiteOpenHelper extends SQLiteOpenHelper {
public MySQLiteOpenHelper(Context context, int dbVersion, String dbName) {
super(context, dbName, null, dbVersion);
}
@Override
public void onCreate(SQLiteDatabase db) {
//Code to create your db here
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Code to upgrade your db here
}
}
開いているデータベースのバージョンよりも新しいバージョンで SQLiteOpenHelper を構築するときに呼び出されます。何をすべきかは、古いバージョンと新しいバージョンの間で行われたデータベースの変更によって異なります。変更されたテーブルを削除しない唯一のケースは、変更が追加された列以上のものである場合です。次に、ALTER TABLE ステートメントを使用して、新しい列をテーブル シグネチャに追加できます。
すべての投稿を確認し、デバッグ コードを実行しても、onUpgrade がいつ呼び出されるかはわかりませんでした。Androidには深刻な欠陥があると思い始めていた..
このページの情報は、最終的な解決策につながりました。すべての貢献者に感謝します!
これで解決しました...
public class DatabaseHelper extends SQLiteOpenHelper {
public static String TAG = DatabaseHelper.class.getName();
private static final int DATABASE_VERSION = 42;
private static final String DATABASE_NAME = "app_database";
private static final String OLD_TABLE = "old_and_useless";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion ) {
if( newVersion > oldVersion) {
Log.d( TAG, "cool! you noticed." );
db.execSQL( "DROP TABLE IF EXISTS " + OLD_TABLE );
// other calls like onCreate if necessary
} else {
Log.d( TAG, "Hey! didn't you see me?" );
}
}
public void checkDatabaseVersion() {
SQLiteDatabase db = this.getWritableDatabase();
// if the DATABASE_VERSION is newer
// onUpgrade is called before this is reached
}
// other code removed for readability...
}
getWritableDatabase() と getReadableDatabase() が onUpgrade 呼び出しになるのは事実です。これらは私のニーズに合っているため、他の方法はチェックしませんでした。
読み続けてください、キッカーが来ています...
私の最初のアクティビティのこのコードは、デバッグ中にdbバージョンが更新されていることに最終的に気付いたときに私を啓発しました... うーん!
DatabaseHelper dbHelper = new DatabaseHelper( this );
dbHelper.checkDatabaseVersion();
注: DatabaseHelper コンストラクターを呼び出すと、db バージョンが更新されます
コンストラクター呼び出しの後、db は新しいバージョンでタグ付けされました。getWritableDatabase() または getReadableDatabase() を呼び出す前にアプリを強制終了すると、新しいバージョンになります。その後、DATABASE_VERSION が再び増加するまで、新しい実行は onUpgrade メソッドを呼び出しません。(ため息!今ではばかげて明白に思えます :)
私の提案は、ある種の「checkDatabaseVersion()」をアプリの初期段階に追加することです。または、SQLiteOpenHelper オブジェクトを作成する場合は、アプリが終了する前にメソッド (getWritableDatabase()、getReadableDatabase() など) のいずれかを呼び出すようにしてください。
私はこれが他の誰かが同じ頭を悩ませるのを救うことを願っています!... :p