Загрузить существующую базу данных в универсальное приложение

#c# #sqlite #windows-runtime #windows-8.1 #win-universal-app

#c# #sqlite #windows-среда выполнения #windows-8.1 #win-universal-app

Вопрос:

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

Я установил все необходимые пакеты, и я использую SQLitePCL оболочку.

когда я пытаюсь открыть файл db с помощью этой команды:

 conn = new SQLiteConnection("test.db");
  

Это создает новую пустую базу данных. (Я имею в виду, что каждая SELECT команда завершается ошибкой без такой таблицы. Итак, это не моя база данных, это новая.)

Также,

 conn = new SQLiteConnection("ms-appx:///test.db");
  

выдает это исключение:

Не удается открыть файл базы данных: ms-appx:///test.db Подробности: не удается открыть файл базы данных

мой test.db находится в корне общего проекта, для которого Build Action установлено значение Content и Copy to Output Directory установлено значение If Newer .

Я не уверен, что я делаю неправильно. Вы можете мне помочь?

  • Пожалуйста, примите мои извинения, если это глупый вопрос, я новичок в программировании WinRT.

Ответ №1:

Существует решение о sqlite-net оболочке, которое также работает для SQLitePCL здесь: http://wp.qmatteoq.com/import-an-already-existing-sqlite-database-in-a-windows-8-application /

Суть в том, что эти оболочки ищут базу данных внутри LocalStorage папки. Поэтому вам нужно будет скопировать файл в LocalStorage перед доступом к базе данных.

 private async Task CopyDatabase()
{
    bool isDatabaseExisting = false;
 
    try
    {
        StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync("people.db");
        isDatabaseExisting = true;
    }
    catch
    {
        isDatabaseExisting = false;
    }
 
    if (!isDatabaseExisting)
    {
        StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync("people.db");
        await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);
    }
}
  

После этого база данных будет доступна с помощью этой строки кода:

 conn = new SQLiteConnection("test.db");
  

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

Комментарии:

1. Свойство Build Action of people.db должно быть Content . Если она не установлена, база данных не включается в приложение.

2. Куда я должен поместить свой «people.db» в проекте? … Должен ли я поместить его в папку активов, или я должен создать для него пользовательскую папку, или его следует поместить в корневую папку? любой может помочь, пожалуйста.