Работа с базой данных SQLite.NET: Часть 3

В этом кратком руководстве рассматриваются следующие темы:

  • Локальное хранение данных в базе данных SQLite.NET.

В этом кратком руководстве объясняется, как хранить данные в локальной базе данных SQLite.NET из приложения Оболочки в Xamarin.Forms. Ниже показано итоговое приложение:

Обновление приложения с помощью Visual Studio

1) Запустите Visual Studio и откройте решение Notes.

2) В обозревателе решений щелкните правой кнопкой мыши решение Notes и выберите Manage NuGet Packages for Solution... (Управление пакетами NuGet для решения...):

3) В разделе Диспетчер пакетов NuGet выберите вкладку Обзор и найдите пакет NuGet sqlite-net-pcl.

Существует несколько пакетов NuGet с похожими названиями. Правильный пакет имеет следующие атрибуты:

Несмотря на название, этот пакет NuGet можно использовать в проектах .NET Standard.

В разделе Диспетчер пакетов NuGet выберите правильный пакет sqlite-net-pcl, установите флажок Проект и нажмите кнопку Установить, чтобы добавить его в решение.

Этот пакет будет использоваться для включения в приложение операций с базами данных и будет добавлен в каждый проект решения.

Закройте Диспетчер пакетов NuGet.

4) В обозревателе решений выберите проект Notes и откройте файл Note.cs в папке Models, а затем замените существующий код следующим:

using System;
using SQLite;


namespace Notes.Models
{
    public class Note
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string Text { get; set; }
        public DateTime Date { get; set; }
    }
}

Этот класс определяет модель Note, где будут храниться данные о каждой заметке в этом приложении. Свойство ID помечено атрибутами PrimaryKey и AutoIncrement, чтобы каждый экземпляр Note в базе данных SQLite.NET имел уникальный идентификатор, предоставленный SQLite.NET.

Сохраните изменения в Note.cs, нажав клавиши CTRL+S.

В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.

5) В обозревателе решений добавьте новую папку с именем Data в проект Notes.

6) В обозревателе решений выберите проект Notes и добавьте новый класс с именем NoteDatabase в папку Data.

7) Замените содержимое файла NoteDatabase.cs следующим кодом:

using System.Collections.Generic;
using System.Threading.Tasks;
using SQLite;
using Notes.Models;


namespace Notes.Data
{
    public class NoteDatabase
    {
        readonly SQLiteAsyncConnection database;


        public NoteDatabase(string dbPath)
        {
            database = new SQLiteAsyncConnection(dbPath);
            database.CreateTableAsync().Wait();
        }


        public Task<>> GetNotesAsync()
        {
            //Get all notes.
            return database.Table().ToListAsync();
        }


        public Task GetNoteAsync(int id)
        {
            // Get a specific note.
            return database.Table()
                            .Where(i => i.ID == id)
                            .FirstOrDefaultAsync();
        }


        public Task SaveNoteAsync(Note note)
        {
            if (note.ID != 0)
            {
                // Update an existing note.
                return database.UpdateAsync(note);
            }
            else
            {
                // Save a new note.
                return database.InsertAsync(note);
            }
        }


        public Task DeleteNoteAsync(Note note)
        {
            // Delete a note.
            return database.DeleteAsync(note);
        }
    }
}

Этот класс содержит код, чтобы создать базу данных, считывать и записывать данные в ней, а также удалять данные из нее. В коде используются асинхронные API-интерфейсы SQLite.NET, которые перемещают операции базы данных в фоновые потоки. Кроме того конструктор NoteDatabase принимает путь файла базы данных в качестве аргумента. Этот путь будет предоставлен классом App в следующем шаге.

Сохраните изменения в NoteDatabase.cs, нажав клавиши CTRL+S.

В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.

8) В обозревателе решений в проекте Notes разверните App.xaml и дважды щелкните файл App.xaml.cs, чтобы открыть его: Затем замените существующий код следующим:

using System;
using System.IO;
using Notes.Data;
using Xamarin.Forms;


namespace Notes
{
    public partial class App : Application
    {
        static NoteDatabase database;


        // Create the database connection as a singleton.
        public static NoteDatabase Database
        {
            get
            {
                if (database == null)
                {
                   database = new NoteDatabase(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Notes.db3"));
                }
                return database;
            }
        }


        public App()
        {
            InitializeComponent();
            MainPage = new AppShell();
        }


        protected override void OnStart()
        {
        }


        protected override void OnSleep()
        {
        }


        protected override void OnResume()
        {
        }
    }
}

Этот код определяет свойство Database, которое создает экземпляр NoteDatabase в качестве отдельной базы данных, передавая имя файла базы данных в качестве аргумента в конструктор NoteDatabase. Преимущество использования отдельной базы данных в том, что создается отдельное подключение к базе данных, которое остается открытым, пока работает приложение. Это позволяет избежать затрат, связанных с открытием и закрытием файла базы данных каждый раз, когда выполняется операция с ней.

Сохраните изменения в файле App.xaml.cs, нажав клавиши CTRL+S.

В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.

9) В обозревателе решений в проекте Notes разверните NotesPage.xaml в папке Views и откройте NotesPage.xaml.cs. Затем замените методы OnAppearing и OnSelectionChanged следующим кодом:

protected override async void OnAppearing()
{
    base.OnAppearing();


    // Retrieve all the notes from the database, and set them as the
    // data source for the CollectionView.
    collectionView.ItemsSource = await App.Database.GetNotesAsync();
}


async void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.CurrentSelection != null)
    {
        // Navigate to the NoteEntryPage, passing the ID as a query parameter.
        Note note = (Note)e.CurrentSelection.FirstOrDefault();
        await Shell.Current.GoToAsync($"{nameof(NoteEntryPage)}?{nameof(NoteEntryPage.ItemId)}={note.ID.ToString()}");
    }
}

Метод OnAppearing заполняет CollectionView любыми заметками, хранящимися в базе данных. Метод OnSelectionChanged переходит к объекту NoteEntryPage, передавая свойство ID выбранного объекта Note в качестве параметра запроса.

Сохраните изменения в файле NotesPage.xaml.cs, нажав клавиши CTRL+S.

В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.

10) В обозревателе решений разверните NoteEntryPage.xaml в папке Views и откройте NoteEntryPage.xaml.cs. Затем замените методы LoadNote, OnSaveButtonClicked и OnDeleteButtonClicked следующим кодом:

async void LoadNote(string itemId)
{
    try
    {
        int id = Convert.ToInt32(itemId);
        // Retrieve the note and set it as the BindingContext of the page.
        Note note = await App.Database.GetNoteAsync(id);
        BindingContext = note;
    }
    catch (Exception)
    {
        Console.WriteLine("Failed to load note.");
    }
}


async void OnSaveButtonClicked(object sender, EventArgs e)
{
    var note = (Note)BindingContext;
    note.Date = DateTime.UtcNow;
    if (!string.IsNullOrWhiteSpace(note.Text))
    {
        await App.Database.SaveNoteAsync(note);
    }


    // Navigate backwards
    await Shell.Current.GoToAsync("..");
}


async void OnDeleteButtonClicked(object sender, EventArgs e)
{
    var note = (Note)BindingContext;
    await App.Database.DeleteNoteAsync(note);


    // Navigate backwards
    await Shell.Current.GoToAsync("..");
}

NoteEntryPage использует метод LoadNote для получения заметки из базы данных, идентификатор которой был передан на страницу в качестве параметра запроса, и сохраняет его в виде объекта Note вBindingContext страницы. При выполнении обработчика событий OnSaveButtonClicked экземпляр Note сохраняется в базе данных, и приложение возвращается на предыдущую страницу. При выполнении обработчика событий OnDeleteButtonClicked экземпляр Note удаляется из базы данных, и приложение возвращается на предыдущую страницу.

Сохраните изменения в файле NoteEntryPage.xaml.cs, нажав клавиши CTRL+S.

11) Создайте и запустите проект на каждой соответствующей платформе.

На странице NotesPage нажмите кнопку Добавить, чтобы перейти к странице NoteEntryPage и ввести заметку. После сохранения заметки приложение вернется на страницу NotesPage.

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

Дальнейшие действия

В этом кратком руководстве рассматривались следующие темы:

  • Локальное хранение данных в базе данных SQLite.NET.

Перейдите к следующему краткому руководству, чтобы стилизовать приложение с помощью стилей XAML.

Материалы по теме