company_banner

SQLite теперь для мобильных приложений на С# под любую платформу

    image

    Совсем недавно вышла новая версия библиотеки, которая будет полезна С# разработчикам, разрабатывающим или планирующим разрабатывать кроссплатформенные мобильные приложения.

    SQLitePCL может быть использована для реализации локальной базы данных в приложениях для Windows, Windows Store, Windows Phone, Android (Xamarin) и iOS (Xamarin). Она бесплатна и ее код открыт для всех желающих.

    Я проверила ее в действии, чем и хочу с вами поделиться.

    Создаем проект


    Для экспериментов нам понадобится проект универсального приложения для Windows и Phone.

    image

    И проекты Xamarin для Android и iOS приложений.

    image

    Подключаем необходимые библиотеки


    Для каждого проекта устанавливаем и добавляем в References пакет SQLite-net PCL. Он автоматически установит и SQLitePCL.raw. Это всё, что нам надо будет для использования.

    image

    Создаем базу данных и реализуем CRUD операции


    Мы будем реализовывать логику работы с данными в уже имеющемся у нас, общем для всех приложений, Shared проекте. Но вы можете делать это и в новой, созданной для этих целей Portable Class Library.

    Итак, добавим в Shared проект два файла. Один из них MessageItem.cs — будет содержать структуру объекта, который мы будем хранить в базе данных, второй DataBase.cs – реализовывать взаимодействие с БД SQLite.

    image

    Код MessageItem.cs
    using SQLite;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace CrossplatformApp
    {
        public class MessageItem
        {
            [PrimaryKey, AutoIncrement]
            public Guid Id { get; set; }
            public string Text { get; set; }
            public string User { get; set; }
            public string Created { get; set; }
        }
    }
    


    Код DataBase.cs
    using System;
    using System.Collections.Generic;
    using System.Text;
    using SQLitePCL;
    using System.Threading.Tasks;
    using System.Linq;
    using System.IO;
    using SQLite;
    
    namespace CrossplatformApp
    {
        public class Database
        {
            private const string _db = "CrossplatformApp.db";
            private SQLiteConnection _connection = null;
    
            public Database(string path)
            {   
                string _dbpath = Path.Combine(path, _db);
    
                _connection = new SQLiteConnection(_dbpath);
                _connection.CreateTable<MessageItem>();
             
            }       
            ~Database()
            {
                if(_connection!=null)
                    _connection.Close();
            }
           
            public int AddNewItem(MessageItem item)
            {
                var result = _connection.Insert(item);
                return result;
            }
    
            public int UpdateItem(MessageItem item)
            {
                var result = _connection.Update(item);
                return result;
            }
    
            public int DeleteItem(MessageItem item)
            {
                var result = _connection.Delete(item);
                return result;
            }
    
            public IQueryable<MessageItem> GetAllItems()
            {
                var result = _connection.Table<MessageItem>().OrderByDescending(t => t.Created);
                return result.AsQueryable<MessageItem>();
            }
        }
    }
    


    Используем для W8, WP, iOS, Android


    Посмотрим, как будет работать наша БД на Windows Phone.

    Перейдем в проект Windows Phone приложения и доработаем основную страницу.

    1. Заменим весь XAML код в MainPage.xaml, чтобы сделать простой интерфейс приложения и отображать данные из базы пользователю.

    image

    MainPage.xaml
    <Page
        x:Class="CrossplatformApp.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:CrossplatformApp"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        
        <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
            <Grid.RowDefinitions>
                <RowDefinition Height="100*"/>
                <RowDefinition Height="567*"/>
            </Grid.RowDefinitions>
    
            <ListView x:Name="SampleListView" ItemsSource="{Binding}" Grid.RowSpan="2" Grid.Row="1" Margin="20,20,20,0" >
                <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid Grid.Column="1" Margin="10,0,0,0">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <TextBlock HorizontalAlignment="Left" 
                                   Text="{Binding User}" 
                                   VerticalAlignment="Top" 
                                   Margin="0,0,0,-0.167" 
                                   Style="{StaticResource ListViewItemTextBlockStyle}"/>
                        <TextBlock HorizontalAlignment="Left" 
                                   TextWrapping="Wrap" 
                                   Text="{Binding Text}" 
                                   VerticalAlignment="Top" 
                                   Margin="0" 
                                   Grid.Row="1" 
                                   Style="{StaticResource ListViewItemSubheaderTextBlockStyle}"/>
                    </Grid>
                </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="SQLite PCL" VerticalAlignment="Bottom" FontSize="48" FontFamily="Global User Interface" Margin="20,0,0,0"/>
    
        </Grid>
    </Page>
    


    2. Напишем код приложения. Создадим БД, наполним данными и выведем их на экран.

    image

    MainPage.xaml.cs
    Database db = new Database(ApplicationData.Current.LocalFolder.Path);
                
    db.AddNewItem(new MessageItem { Id = Guid.NewGuid(), Text = "bla-bla", User = "@MissUFO", Created = DateTime.UtcNow.ToString() });
    
    var messages = db.GetAllItems();
    
    SampleListView.DataContext = messages;
    


    3. Запустим проект и посмотрим на результат. БД создалась успешно, данные записываются и читаются.

    image

    Для Android и iOS процедура выглядит в точности так же. Вы можете подключить Shared проект в качестве References и пользоваться нашими классами.

    image

    Заключение


    Свежая версия библиотеки SQLitePCL вышла только-только, поэтому, если что не так, смотрите документацию и пишите свои проблемы и вопросы на codeplex её авторам.

    Полезные ссылки


    Скачать SQLitePCL
    Читать документацию по SQLite
    Скачать Visual Studio 2013 Update 2

    Дополнительные ссылки


    Microsoft
    191,62
    Microsoft — мировой лидер в области ПО и ИТ-услуг
    Поделиться публикацией

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

      +2
      А чем он лучше существующих решений? С SQLite'ом нет проблем под Xamarin'ом и без него. В чем профит перед тонким и уютным SQLite.NET (можно не учитывать его ORM составляющую)? Перед громоздким портом — да, согласен, и то, иногда он бывает полезен / удобен.
        +1
        Например, офлайн синхронизацию через Azure Mobile Services умеет msopentech.com/blog/2014/06/09/azure-mobile-services-offline-adds-xamarin-support-using-sqlitepcl/. И на новом windows phone 8.1 работает )
          +3
          Хм. Документации толком нет еще, правильно понимаю? Помогите разобраться, получается следующая ситуация, есть основной контрибутор в лице Xamarin'а, которые гифтят свою обертку над vsix-пакетом, вы добавляете туда синк с AMS и выкатываете на паблик, снабжая кучей маркетингового булшита :)? Какие-то глобальные изменения были? Скажем так, прелесть SQLitePCL только в работе с AMS'ом?
            +1
            Работает в WinRT (чего пока не многие делают), и на всех других платформах тоже, позвляет делать офлайн синхронизацию AMS или Sync Framework, поддерживает EF и LyncToSql.
              +2
              Позитивно, спасибо. WinRT же из коробки идет, oбертка над SQLite имеет какие-то нюансы связанные с WinRT? Кстати, раскройте секрет — Xamarin скоро покупаете, слухи ходят уже?
                +1
                Незнаю ничего про Xamarin. Слухи по интернету гуляют, но на сколько это правда — не понятно. Обертка — это Portable Class Library которая умеет работать на winRT
        0
        Татьяна, спасибо за статью!
        Возникло несколько вопросов:
        1) Как у PCL реализации SQLite с параллельными запросами к базе данных (в SQL CE для WP они отсуствовали в принципе)?
        2) Существует ли API для обновления базы(DatabaseSchemaUpdater в SQL CE) или нужно пистаь запросы добавления объектов базы вручную?
        3) Как обстоят дела в WinRT реализации с поддержкой кирилицы в пути к файлу базы? Раньше были проблемы.
          +2
          1. Есть транзакции. С параллельными запросами развлекаться еще не пробовала, но вопрос интересный.
          2. Выше есть ссылка на штуку, которая производит синхронизацию из облачной БД Azure Mobile Services в SQLite. SyncFramework тоже умеет это делать с SQLite базой. Т.е. не только сравнивать контент в таблицах, но и структуру таблиц обновлять и менять.
          3. БД с русскими буквами в пути к ней — работает.
            0
            Пользуюсь портом SQLite PCL для Silverlight. Параллельные запросы никак не защищены — проявляются рандомные ошибки от блокировок в таблицах до ошибок доступа к файлу БД.
            Пришлось организовывать внешние блокировки, которые не пускают на движок SQLite более одного запроса в один момент времени.
              0
              В сухом остатке, есть какие-то веские причины использовать SQLite вместо SQL CE кроме кросс-платформенности?
                +1
                WinRT, а значит и Windows Phone 8.1 не поддерживают SQL CE. Ну и если нужна офлайн база с возможностями синхронизации с БД на сервере, то тоже SQLite имеет больше возможностей
                  0
                  Хм… Строки длиной более 4 килобайт?
                    0
                    SQL CE проигрывает в плане производительности, значительно. Пруфлинков не будет сходу, к сожалению, но проверял лично.
                      0
                      Огромный прирост производительности + на моём проекте после перехода на SQLite размер файла БД уменьшился раза в полтора. Плюс для SQLite имеются нормальные средства разработки (менеджер БД), в отличии от того же SQL CE.
                  0
                  для Windows, Windows Store, Windows Phone, Android и iOS

                  У вас на первой картинке нет iOS-устройства, зато есть OS X
                    0
                    Дизреспект за мелкие некликабельные скриншоты.
                      +3
                      спасибо, учту!
                      0
                      А что с EF или Linq2SQL?
                        +1
                        да, и то и другое работает
                          +1
                          Кстати недавно на dotnetconf объявляли о EF 7.0 (alpha) о поддержке Windows Phone, Windows 8
                          0
                          Спасибо!
                          Как подключить к Unity3D?
                            0
                            Имеется ввиду проект Unity открытый в Visual Studio? Если да, то так же как и для других проектов в VS, устанавливаешь и в референсы. Для чистого Unity плагинов не знаю и не уверена что есть они, надо изучать.
                              0
                              Спасибо.
                              Имел в виду MonoDevelop 4.0.1
                            0
                            а для какого профиля она подходит? есть ли поддержка для 78 и 158?

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

                            Самое читаемое