onUpgrade()中新创建的表不包括NOT NULL列设置

时间:2013-11-06 20:09:22

标签: android android-sqlite

当我将应用程序的数据库从一个版本升级到另一个版本时,我执行以下命令:

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");

我需要将NOT NULL ON CONFLICT IGNORE参数添加到两个 tags_vocab 的列中,但由于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 
);

重新制作桌子时,我做错了吗?

0 个答案:

没有答案