Статьи

Обходной путь для использования SQLite в приложении Windows Phone 8


Недавно
я сделал пост, в котором я попытался лучше объяснить ситуацию с поддержкой SQL Lite в Windows Phone 8. Суть поста была очень простой: механизм SQLite доступен для Windows Phone 8, но на самом деле это библиотека для манипулирования данные, использующие язык высокого уровня, такой как C # или VB.NET, отсутствуют.

Одним из обходных путей, о котором я говорил, было использование csharp-sqlite , проекта с открытым исходным кодом, размещенного в Google Code, который встраивает движок SQLite в библиотеку C #, так что он может также использоваться приложениями на основе .NET Framework. В этом проекте также имеется клиентская библиотека, которую можно использовать для управления базой данных: есть также портирование библиотеки на Windows Phone, но вы не можете поделиться ею с проектом Windows 8 из-за отсутствия поддержки .NET Framework ,

К счастью, все еще есть решение для совместного использования вашего уровня данных с приложением Windows 8: с помощью sqlite-net. Я уже говорил об этой библиотеке в предыдущем посте, и это, пожалуй, самая известная оболочка для нативного движка SQLite. Хорошая новость заключается в том, что sqlite-net поддерживает два разных движка SQLite, в зависимости от платформы: собственный в Windows 8 и csharp-sqlite в Windows Phone 7 или 8. В результате вы сможете использовать классы и методы sqlite-net на обеих платформах и общий код между ними: в соответствии с платформой будет использоваться соответствующий механизм SQLite. Есть ли обратная сторона? Да, csharp-sqliteявляется портированием и не управляется напрямую командой SQLite. Это означает, что каждый раз, когда команда SQLite выпускает обновление движка, движок C # должен быть перекомпилирован с новым. Кроме того, кажется, что проект был заброшен: последняя версия была выпущена 26 августа 2011 года, так что он немного староват. Это означает, что вы пропустите все улучшения, которые команда SQLite сделала за последний год.

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

Хватая двигатель

Первое, что нужно сделать, это зайти на страницу Download проекта csharp-sqlite и загрузить последнюю доступную версию, то есть 3.7.7.1.71 . На NuGet нет бинарной версии или пакета: вам придется вручную открыть файл решения Community.CsharpSqlite.SQLiteClient.WP.sln в папке Community.CsharpSqlite.SQLiteClient.WP. Visual Studio 2012 обновит некоторые файлы решений, так как он был создан с использованием Visual Studio 2010. Теперь создайте решение: вы можете получить некоторые ошибки компиляции, в этом случае попробуйте собрать только проект Community.CsharpSqlite.WinPhone ; на самом деле, ошибки сборки просто вызваны некоторыми модульными тестами, которые не используют допустимый код.

Как только вы это сделаете, откройте папку проекта и возьмите файл Community.CsharpSqlite.WinPhone.dll из папки bin / Debug : это ссылка, которую вам нужно добавить в ваш проект Windows Phone 8, поэтому идите и создайте новый, используя базовый шаблон приложения Windows Phone и выберите ОС Windows Phone 8.0 в качестве целевой ОС. Теперь вам нужно добавить ссылку на библиотеку, которую мы скопировали ранее, щелкнув правой кнопкой мыши по проекту и выбрав Добавить ссылку . После этого пришло время установить sqlite-net с помощью NuGet : снова щелкните правой кнопкой мыши по проекту, выберите « Управление пакетами NuGet» , найдите и установите пакет под названиемSQLite-сеть.

Играя с SQLite

Как только вы закончите, вы найдете несколько новых файлов в вашем проекте: откройте файл SQLite.cs ; прямо наверху вы увидите, о чем я говорил в начале поста.

#if WINDOWS_PHONE
    #define USE_CSHARP_SQLITE
#endif




#if USE_CSHARP_SQLITE
    using Community.CsharpSqlite;
    using Sqlite3DatabaseHandle = Community.CsharpSqlite.Sqlite3.sqlite3;
    using Sqlite3Statement = Community.CsharpSqlite.Sqlite3.Vdbe;
#else
    using Sqlite3DatabaseHandle = System.IntPtr;
    using Sqlite3Statement = System.IntPtr;
#endif

Как вы можете видеть, используя инструкции условной компиляции, sqlite-net определит и активирует символ USE_CSHARP_SQLITE в случае, если приложение работает на Windows Phone. Этот символ будет использоваться в библиотеке для переноса различных поведений в стандартные методы и классы sqlite-net: таким образом, вы сможете использовать один и тот же код для чтения и записи данных в базу данных, независимо от платформы.

И что теперь? Вы можете скопировать и вставить тот же код, который я объяснил в этом посте : поскольку библиотека одна и та же, вы сможете использовать тот же подход для работы с данными. Например, вы можете сделать что-то вроде этого, чтобы создать базу данных и таблицу для хранения сущности Person :

private async void CreateDatabase()
{
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection("people");
    await conn.CreateTableAsync
 
  ();
}

 

После этого вы можете вставить некоторые данные в базу данных:

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection("people");




    Person person = new Person
    {
        Name = "Matteo",
        Surname = "Pagani"
    };




    await conn.InsertAsync(person);
}

или прочитайте те же данные и запишите их в окно вывода:

private async void Button_Click_2(object sender, RoutedEventArgs e)
{
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection("people");




    var query = conn.Table
 
  ().Where(x => x.Name == "Matteo");
    var result = await query.ToListAsync();
    foreach (var item in result)
    {
        Debug.WriteLine(string.Format("{0}: {1} {2}", item.Id, item.Name, item.Surname));
    }
}

 

Если бы я выделил код для взаимодействия с базой данных в другом классе (например, в классе обслуживания), я бы мог использовать его как в приложениях Windows 8, так и в Windows Phone 8, не меняя его: sqlite-net сделал бы всю грязную работу, используя правильный двигатель для меня.

Вывод

В этом посте мы увидели способ взаимодействия с базой данных SQLite и совместного использования кода между Windows Phone и Windows 8. Это не лучший подход, поскольку он заставляет нас использовать неофициальный перенос SQLite, который не обновляется с тех пор. более года. Но если у вас нет сложного сценария, и вам нужно как можно скорее начать работу над приложением, и вам нужно поделиться кодом с Windows 8 (поэтому SQL CE не является решением), это может быть приемлемым подходом. Очевидно, что лучшим решением было бы иметь собственную реализацию sqlite-net также для Windows Phone 8, чтобы использовать собственный движок SQLite, который уже доступен в Windows Phone 8. Он придет … в конце концов, однажды или другойУлыбка