Моя команда ранее использовала Qt 4.3 и пытается выполнить обновление до последней версии (4.7.2).
Раньше мы использовали плагин qsqlite, но эта функциональность была перемещена в основной компонент QSql Qt.
Теперь, когда мы обновились, мы не можем читать наши старые базы данных. Кажется, это потому, что когда мы создавали наши таблицы, мы создавали их так:
CREATE TABLE [Characters] ([Id] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK AUTOINCREMENT UNIQUE ON CONFLICT ROLLBACK, [Project_Id] INTEGER NOT NULL ON CONFLICT ROLLBACK REFERENCES [Projects](Id) ON DELETE RESTRICT ON UPDATE RESTRICT ON INSERT RESTRICT, [CharacterName] VARCHAR(128) NOT NULL ON CONFLICT ROLLBACK UNIQUE ON CONFLICT ROLLBACK);
но ON INSERT RESTRICT
больше не действует.
Я смог удалить этот код и создать новые таблицы, но если я сделаю myQSqlDatabase.tables()
в одной из существующих баз данных, он вернет ноль.
Я заметил, копаясь в коде Qt, что метод подготовки имеет:
#if (SQLITE_VERSION_NUMBER >= 3003011)
int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, 0);
#else
int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, 0);
#endif
и мы входим в первое if (sqlite3_prepare16_v2
).
Должны ли мы определять SQLITE_VERSION_NUMBER где-то ниже? Есть ли что-то еще, что мы делаем неправильно, чтобы предотвратить обратную совместимость?
Любая помощь будет оценена по достоинству.
Спасибо, Лирон