使用自动增量主键迁移 Room 数据库

ntw*_*d33 2 sql android migrate android-room

我有一个实体用户,它在保存到数据库时自动创建 UID。

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

如何保留旧的 UID?

 ContentValues cv = null;
            try {
                Cursor c = database.query("SELECT * FROM users");
                if (c.moveToFirst()) {
                    cv = new ContentValues();
                    do {
                        cv.put("uid", c.getLong(c.getColumnIndex("uid")));
                        cv.put("name", c.getString(c.getColumnIndex("name")));                       
                    } while (c.moveToNext());
                }
            } catch (Exception ex) {
                Logger.ex(TAG, ex);
            }

            database.execSQL("DROP TABLE IF EXISTS 'users'");
            database.execSQL("CREATE TABLE IF NOT EXISTS `users` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
                    "`name` TEXT)");

            if (cv != null)
                database.insert("users", 0, cv);
Run Code Online (Sandbox Code Playgroud)

Mik*_*keT 5

您最多只保存 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);
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用以下方法简化上述内容:-

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`");
Run Code Online (Sandbox Code Playgroud)

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

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

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