Работа с существующей БД SQLite

Последнее обновление: 31.10.2015

В предыдущих темах мы рассмотрели процесс работы с новой БД SQLite, теперь рассмотрим ситуацию, если у нас база данных уже существует, и нам ее надо подключить к приложению.

Для начала создадим базу данных SQLite. Для этого можно воспользоваться специальными инструментами, например, программой Sqlitebrowser. Ее можно найти по адресу http://sqlitebrowser.org.

Sqlitebrowser представляет графический интерфейс для создания базы данных и определения в ней всех необходимых таблиц:

Создание бд SQLite

Как видно на скриншоте выше, у меня определена таблица users с тремя полями: _id, name, age.

И там же в программе добавим несколько элементов в созданную таблицу:

Новая база данных SQLite

Итак, есть существующая база данных с одной таблицей, в которой есть три элемента. Добавим ее в проект и установим у нее в панели свойств для параметра Build Action значение Content

Добавление SQLite в проект Windows Phone 8.1

Также определим класс 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();
}
Работаем в SQLite в WP8.1
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850