В предыдущих темах мы рассмотрели процесс работы с новой БД SQLite, теперь рассмотрим ситуацию, если у нас база данных уже существует, и нам ее надо подключить к приложению.
Для начала создадим базу данных SQLite. Для этого можно воспользоваться специальными инструментами, например, программой Sqlitebrowser. Ее можно найти по адресу http://sqlitebrowser.org.
Sqlitebrowser представляет графический интерфейс для создания базы данных и определения в ней всех необходимых таблиц:
Как видно на скриншоте выше, у меня определена таблица users с тремя полями: _id, name, age.
И там же в программе добавим несколько элементов в созданную таблицу:
Итак, есть существующая база данных с одной таблицей, в которой есть три элемента. Добавим ее в проект и установим у нее в панели свойств для параметра Build Action значение Content
Также определим класс User, представляющий объект из БД:
public class User { public long Id { get; set; } public string Name { get; set; } public long Year { get; set; } }
И добавим класс репозитория, через который будем взаимодействовать с базой данных:
using SQLitePCL; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.ApplicationModel; using Windows.Storage; namespace SQLiteApp { public class UserRepository { public SQLiteConnection con; static string dbname = "usersdb.db3"; public UserRepository() { this.con = new SQLiteConnection(dbname); } public static async Task CopyDatabase() { bool isDatabaseExisting = false; try { StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(dbname); isDatabaseExisting = true; } catch { isDatabaseExisting = false; } if (!isDatabaseExisting) { StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync("usersdb.db3"); await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder); } } public void Insert(User user) { using (var statement = con.Prepare("INSERT INTO users(name, year) VALUES (?,?)")) { statement.Bind(1, user.Name); statement.Bind(2, user.Year); statement.Step(); } } public ObservableCollection<User> GetUsers() { ObservableCollection<User> users = new ObservableCollection<User>(); using (var statement = con.Prepare("SELECT _id, name, year FROM users")) { while (statement.Step() == SQLiteResult.ROW) { User user = new User(); user.Id = (long)statement[0]; user.Name = (string)statement[1]; user.Year = (long)statement[2]; users.Add(user); } } return users; } public User GetUser(long id) { User user = null; using (var statement = con.Prepare("SELECT _id, name, year FROM users WHERE _id=?")) { statement.Bind(1, id); if (statement.Step()==SQLiteResult.ROW) { user = new User(); user.Id = (long)statement[0]; user.Name = (string)statement[1]; user.Year = (long)statement[2]; } } return user; } public void Update(User user) { using (var statement = con.Prepare("UPDATE users SET name=?, year=? WHERE _id=?")) { statement.Bind(1, user.Name); statement.Bind(2, user.Year); statement.Bind(3, user.Id); statement.Step(); } } public void Delete(long id) { using (var statement = con.Prepare("DELETE FROM users WHERE _id=?")) { statement.Bind(1, id); statement.Step(); } } } }
В отличие от класса репозитория, использовавшегося в прошлых темах, здесь добавляется метод CopyDatabase()
, котоырй выполняет копирование
базы данных из каталога с установленным пакетом приложения в каталог ApplicationData.Current.LocalFolder, где база данных собственно и должна находиться:
StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync("usersdb.db3"); await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);
Чтобы выполнить копирование БД, перейдем к файлу приложения App.xaml.cs и изменим его метод OnLaunched
:
public static UserRepository repo; protected override async void OnLaunched(LaunchActivatedEventArgs e) { await UserRepository.CopyDatabase(); repo = new UserRepository(); // остальное содержание }
В этом методе перед всем основным остальным содержанием добавляем две строки, которые и выполняют копирование бд и создание объекта репозитория при запуске приложения.
И вся остальная работа будет выглядеть также. Например, плучение данных. Файл MainPage.xaml:
<Page x:Class="SQLiteApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:SQLiteApp" 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> <StackPanel> <TextBlock Text="Пользователи" Style="{ThemeResource HeaderTextBlockStyle}" /> <ListView x:Name="usersList"> <ListView.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding Name}" FontSize="26" /> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackPanel> </Grid> </Page>
А в файле кода MainPage.xaml.cs получение данных в методе OnNavigatedTo
:
protected override void OnNavigatedTo(NavigationEventArgs e) { usersList.ItemsSource = App.repo.GetUsers(); }