使用自动增量主键迁移会议室数据库

时间:2019-09-29 17:58:53

标签: android sql android-room migrate

我有一个实体用户,该实体用户保存到数据库后会自动创建UID。

我正在尝试迁移表,但是用户的旧UID无法迁移,这是一个严重的问题。

如何保留旧的UID?

rm(d2)

1 个答案:

答案 0 :(得分:1)

您最多只能保存1行。

使用上述方法,您希望使用ContentValue数组来保存多个用户。

例如

ArrayList<ContentValues> cvlist = new ArrayList<>();

Cursor c = database.query("SELECT * FROM users");
while(c.moveToNext) {
    ContentValue cv = new ContentValue();
    cv.put("uid",c.getLong(c.getColumnIndex("uid")));
    cv.put("name", c.getString(c.getColumnIndex("name")));
    cvlist.add(cv);
}

database.execSQL("DROP TABLE IF EXISTS 'users'");
        database.execSQL("CREATE TABLE IF NOT EXISTS `users` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
                "`name` TEXT)");
for(ContentValue cv: cvlist) {
    database.insert("users", 0, cv);
}

但是,您可以使用:-

简化上述操作
database.execSQL("CREATE TABLE IF NOT EXISTS `temp_users` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
            "`name` TEXT)");
database.execSQL("INSERT INTO `temp_users` SELECT * FROM `users`");
database.execSQL("ALTER TABLE `users` RENAME TO `original_users`");
database.execSQL("ALTER TABLE `temp_users` RENAME TO `users`");
database.execSQL("DROP TABLE IF EXISTS `original_users`");

这将使用不同的名称(temp_users)创建新表,将所有数据从原始表复制到新表中。然后,它重命名原始表,然后将新表重命名为实际名称(因此现在变成它使用的实际表),最后删除重命名的原始表。

(您可以删除原始表而不更改其名称,但是上面的方法更安全)。

  • 注意。以上为原理代码,尚未运行或测试,因此可能包含一些错误。