Добавить предварительно заполненную таблицу в базу данных без потери существующих данных - PullRequest
1 голос
/ 28 марта 2012

В моем приложении у меня есть база данных sqlite для коллекционирования. База данных предварительно заполнена, но пользователь добавляет данные, чтобы указать, что он владеет этим конкретным элементом. Предметы коллекционирования разбиты на категории, каждая из которых имеет свою таблицу.

Итак, в первой версии приложения у меня есть бейсболисты 2011 года, идентифицированные по номеру и имени. У меня есть все карты с 2009 по 2011 годы в базе данных (с таблицей для каждого года), которая находится в папке активов и импортируется через InputStream. Пока все отлично работает, и пользователь может добавить флаг, говоря, что он владеет картой.

Моя проблема в том, что теперь я хочу добавить карты 2012 года, поэтому я добавил их в качестве дополнительной таблицы в свою базу данных ресурсов для версии 2 приложения. Чего я не могу добиться - это добавить новую (предварительно заполненную) таблицу в существующую базу данных при обновлении, не теряя флаги, установленные пользователем.

Очевидно, я не хочу потерять данные, которые уже были введены пользователями, поэтому нет таблицы DROP.

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

Ошибка 1 (невозможно подключить базу данных в транзакции) на 0x2a1900 при выполнении 'ATTACH DATABASE' /data/data/my.app/databases/updateddb 'как myNewDb'

Я что-то упустил, есть ли обходной путь? Или я поступаю неправильно?

Ответы [ 2 ]

1 голос
/ 28 марта 2012

при обновлении приложения используйте метод onUpgrade для добавления таблицы в существующую базу данных.

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("create table "
        + LIBRARY + "( " + COLUMN_ID
        + " integer primary key autoincrement, " + COLUMN_NAME
        + " text not null, "+COLUMN_URL
        + " text not null);");
         //and populate the table 
}

это просто добавит таблицу в существующую базу данных ..

0 голосов
/ 25 марта 2017

Метод onUpgrade() вызывается внутри транзакции, поэтому вы не можете просто прикрепить другой файл базы данных.

Единственный оставшийся способ изменить базу данных - выполнить команды SQL. Таким образом, вам нужно извлечь данные таблицы в текстовый файл SQL , отправить их вместе с новой версией приложения и в onUpgrade(), выполнить все команды в файле .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...