Работа с базой данных 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 с похожими названиями. Правильный пакет имеет следующие атрибуты:
- Авторы: SQLite-net
- Ссылка NuGet:sqlite-net-pcl
Несмотря на название, этот пакет 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.