База данных Migrate Room с первичным ключом автоинкремента - PullRequest
1 голос
/ 29 сентября 2019

У меня есть Entity User, который автоматически создает 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);

1 Ответ

1 голос
/ 29 сентября 2019

Вы в лучшем случае сохраняете только 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), копирует все строки из исходной таблицы вновый стол. Затем он переименовывает исходную таблицу, а затем переименовывает новую таблицу в фактическое имя (таким образом, теперь становится фактическими таблицами, которые он использовал) и, наконец, удаляет переименованную исходную таблицу.

(вы можете просто удалить исходную таблицувместо того, чтобы изменить его имя, однако вышеупомянутое является более безопасным).

  • Примечание вышеупомянутое является в принципе кодом, оно не было выполнено или проверено и поэтому может содержать некоторые ошибки.
...