в моем приложении у меня есть модель с некоторыми столбцами, в которую нужно добавить новый столбец.
Итак, согласно документация Я написал файл миграции с SQL «изменить таблицу добавить столбец..» и также добавил это свойство в файл модели сплава. Как и ожидалось, это сработало отлично.
Но когда приложение устанавливается на устройство в первый раз, возникает ошибка SQL, говорящая о том, что столбец, который пытается добавить моя миграция, уже существует. Поскольку схема базы данных создается из файлов модели, я думаю, что исключение правильное, но мне интересно, как выполнить изменение базы данных для существующих и недавно установленных приложений. Удаление файла миграции, просто добавление свойства в файл модели заставит его работать при новой установке, но не при обновлениях.
С уважением, Свен
Обновление 1: я попытался добавить первоначальную миграцию, создав таблицу без нового поля, а затем добавив новое поле в другую миграцию (см. ответ Рэя). Все та же ошибка.
Версия Appcelerator: 5.2.2
Тип адаптера модели: sqlrest
Обновление 2 (некоторый код):
модель:
config: {
URL: Alloy.Globals.jsonEndPoint + Alloy.Globals.jsonRequestParams + "foto",
columns:{
id: "INTEGER PRIMARY KEY AUTOINCREMENT",
dateiname: "TEXT",
beschreibung: "TEXT",
primaerfoto: "TEXT",
aufnahmedatum: "TEXT",
anlage_id: "INTEGER",
foto_label_id: "INTEGER",
latest_sync_date: "TEXT",
dirty: "INTEGER",
begehungsbericht_protokoll_id: "INTEGER",
begehungsbericht_protokoll_server_id: "INTEGER",
},
adapter: {
remoteBackup: false, //Prevent database from being saved in icloud
db_name: this.Alloy.Globals.currentDatabase,
type: "sqlrest",
collection_name: "foto",
idAttribute: "id"
}
миграция 1:
migration.up = function(migrator) {
Ti.API.info(">>>>>>>>>>>>>>>> migrate create table UP <<<<<<<<<<<<<");
migrator.createTable({
columns: {
id: "INTEGER PRIMARY KEY AUTOINCREMENT",
dateiname: "TEXT",
beschreibung: "TEXT",
primaerfoto: "TEXT",
aufnahmedatum: "TEXT",
anlage_id: "INTEGER",
foto_label_id: "INTEGER",
latest_sync_date: "TEXT",
dirty: "INTEGER",
begehungsbericht_protokoll_id: "INTEGER",
}
});
миграция 2:
migration.up = function(migrator) {
Ti.API.info(">>>>>>>>>>>>>>>> migrate ALTER table UP <<<<<<<<<<<<<");
migrator.db.execute('ALTER TABLE foto ADD COLUMN begehungsbericht_protokoll_server_id INTEGER;');
};
Обновление 3 (решение с обходным путем): Поскольку я знаю количество столбцов, которые должна иметь таблица при выполнении переноса, я использую эту информацию для условного добавления столбца (как предложил Цезарь).
migration.up = function(migrator) {
Ti.API.info("migrating foto table");
var rows = migrator.db.execute("SELECT * FROM foto");
Ti.API.info("field count: " + rows.fieldCount);
if (rows.fieldCount < 11) {
Ti.API.info("adding column: begehungsbericht_protokoll_server_id");
migrator.db.execute('ALTER TABLE foto ADD COLUMN begehungsbericht_protokoll_server_id INTEGER');
} else {
Ti.API.info("NOT adding column: begehungsbericht_protokoll_server_id");
}
};