SQLite - Создание и изменение баз данных на лету - PullRequest
2 голосов
/ 15 апреля 2010

Сегодня я использую SQLite и отправляю файл базы данных вместе с проектом.

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

Есть ли способ скопировать код, необходимый для создания базы данных на основе существующей базы данных? Проблема заключается в том, что когда пользователь загружает новую версию, он может быть обманут в копировании своей последней базы данных и потерять данные. Мне нужен хороший способ проверить версию базы данных и изменить ее, если мне нужны новые столбцы или таблицы и т. Д. Или, если она вообще не существует, создать новую базу данных?

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

Ответил. Конечный код:

            //Copy the database from the resource
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("resourcename"))
            {
                if (stream == null)
                    throw new NullReferenceException("Stream is null. Cannot find the database in the resources");
                FileStream writer = new FileStream(Constants.SqLiteFile, FileMode.Create);
                int Length = 256;
                Byte[] buffer = new Byte[Length];
                int bytesRead = stream.Read(buffer, 0, Length);
                // write the required bytes
                while (bytesRead > 0)
                {
                    writer.Write(buffer, 0, bytesRead);
                    bytesRead = stream.Read(buffer, 0, Length);
                }
                stream.Close();
                writer.Close();
            }

Ответы [ 2 ]

1 голос
/ 15 апреля 2010

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

Для начала эти запросы могут быть полезны для вас.

-- For getting tables in current db
SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name;

-- For getting info about a table
PRAGMA table_info('tabla_name');
0 голосов
/ 15 апреля 2010

Похоже, вам просто нужно место, чтобы сохранить версию своей текущей системы. Создайте таблицу конфигурации и имейте запись, которая поддерживает любую версию, созданную / обновленную базу данных. Когда они запускают программу установки / обновления, пусть она проверит эту версию, чтобы узнать, существует ли она и / или какая версия установлена, чтобы определить, какие шаги предпринять.

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