1

アプリのデータベースをあるバージョンから別のバージョンにアップグレードするときは、次のコマンドを実行します。

db.execSQL("ALTER TABLE tags_vocab RENAME TO tmp_tags_vocab");
db.execSQL("DROP INDEX idx_tags_vocab");
db.execSQL("CREATE TABLE tags_vocab (id INTEGER PRIMARY KEY AUTOINCREMENT, word_fk INTEGER NOT NULL ON CONFLICT IGNORE, tag_id INTEGER NOT NULL ON CONFLICT IGNORE)");
db.execSQL("INSERT INTO tags_vocab (word_fk, tag_id) SELECT word_fk, tag_id from tmp_tags_vocab");
db.execSQL("CREATE UNIQUE INDEX idx_tags_vocab ON tags_vocab (tag_id ASC, word_fk ASC)");
db.execSQL("DROP TABLE tmp_tags_vocab");

tags_vocabNOT NULL ON CONFLICT IGNOREの2 つの列にパラメーターを追加する必要がありますが、sqliteではその程度の制御が許可されていないため、テーブル全体を再作成する必要があります。ALTER TABLE

問題は、上記のコマンドはすべて正常に実行され、コミットされているように見えますが、アップグレード後のデータベースをアプリのプライベート データベース ディレクトリからプルすると、「変更された」テーブルがまったく変更されていないように見えることです。これは、「変更された」テーブルの DDL です。

CREATE TABLE tags_vocab ( 
id         INTEGER PRIMARY KEY AUTOINCREMENT,
word_fk    INTEGER,
tag_id     INTEGER 
);

DDL次のようになります。

CREATE TABLE tags_vocab ( 
    id         INTEGER PRIMARY KEY AUTOINCREMENT,
    word_fk    INTEGER NOT NULL ON CONFLICT IGNORE,
    tag_id     INTEGER NOT NULL ON CONFLICT IGNORE 
);

テーブルを再作成するときに何か問題がありますか?

4

0 に答える 0