Хранение данных в локальной базе данных SQLite.NET
В этом кратком руководстве рассматриваются следующие темы:
- Локальное хранение данных в базе данных SQLite.NET.
В этом кратком руководстве объясняется, как хранить данные в локальной базе данных SQLite.NET из приложения Оболочки в Xamarin.Forms. Ниже показано итоговое приложение:
Необходимые компоненты
Прежде чем приступать к этому краткому руководству, необходимо успешно завершить предыдущее.
Обновление приложения с помощью Visual Studio
Запустите Visual Studio и откройте решение Notes.
В обозревателе решений щелкните правой кнопкой мыши решение Notes и выберите Manage NuGet Packages for Solution... (Управление пакетами NuGet для решения...):
В разделе Диспетчер пакетов NuGet выберите вкладку Обзор и найдите пакет NuGet sqlite-net-pcl.
Предупреждение
Существует несколько пакетов NuGet с похожими названиями. Правильный пакет имеет следующие атрибуты:
- Авторы: SQLite-net
- Ссылка NuGet: sqlite-net-pcl
Несмотря на название, этот пакет NuGet можно использовать в проектах .NET Standard.
В разделе Диспетчер пакетов NuGet выберите правильный пакет sqlite-net-pcl, установите флажок Проект и нажмите кнопку Установить, чтобы добавить его в решение.
Этот пакет будет использоваться для включения в приложение операций с базами данных и будет добавлен в каждый проект решения.
Внимание
SQLite.NET — это сторонняя библиотека, поддерживаемая репозиторием praeclarum/sqlite-net.
Закройте диспетчер пакетов NuGet.
В обозревателе решений выберите проект 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.
Предупреждение
В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.
В обозревателе решений добавьте новую папку с именем Data в проект Notes.
В обозревателе решений выберите проект Notes и добавьте новый класс с именем NoteDatabase в папку Data.
Замените содержимое файла 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<Note>().Wait(); } public Task<List<Note>> GetNotesAsync() { //Get all notes. return database.Table<Note>().ToListAsync(); } public Task<Note> GetNoteAsync(int id) { // Get a specific note. return database.Table<Note>() .Where(i => i.ID == id) .FirstOrDefaultAsync(); } public Task<int> 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<int> DeleteNoteAsync(Note note) { // Delete a note. return database.DeleteAsync(note); } } }
Этот класс содержит код, чтобы создать базу данных, считывать и записывать данные в ней, а также удалять данные из нее. В коде используются асинхронные API-интерфейсы SQLite.NET, которые перемещают операции базы данных в фоновые потоки. Кроме того конструктор
NoteDatabase
принимает путь файла базы данных в качестве аргумента. Этот путь будет предоставлен классомApp
в следующем шаге.Сохраните изменения в NoteDatabase.cs, нажав клавиши CTRL+S.
Предупреждение
В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.
В обозревателе решений в проекте 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.
Предупреждение
В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.
В обозревателе решений в проекте 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.
Предупреждение
В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.
В обозревателе решений разверните 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.
Создайте и запустите проект на каждой соответствующей платформе. Дополнительные сведения см. в разделе Сборка примера из краткого руководства.
На странице NotesPage нажмите кнопку Добавить, чтобы перейти к странице NoteEntryPage и ввести заметку. После сохранения заметки приложение вернется на страницу NotesPage.
Введите несколько заметок разной длины, чтобы понаблюдать за поведением приложения. Закройте приложение и повторно запустите его, чтобы проверить, сохранены ли в базе данных введенные заметки.
Обновление приложения с помощью Visual Studio для Mac
Запустите Visual Studio для Mac и откройте решение Notes.
На Панели решения щелкните правой кнопкой мыши решение Notes и выберите Manage NuGet Packages... (Управление пакетами NuGet...):
В разделе Manage NuGet Packages (Управление пакетами NuGet) выберите вкладку Обзор и найдите пакет NuGet sqlite-net-pcl.
Предупреждение
Существует несколько пакетов NuGet с похожими названиями. Правильный пакет имеет следующие атрибуты:
- Авторы: SQLite-net
- Ссылка NuGet: sqlite-net-pcl
Несмотря на название, этот пакет NuGet можно использовать в проектах .NET Standard.
В диалоговом окне Manage NuGet Packages (Управление пакетами NuGet) выберите пакет sqlite-net-pcl и нажмите кнопку Добавить пакет, чтобы добавить его в решение:
Этот пакет будет использоваться для включения операций базы данных в приложение.
В диалоговом окне Выбор проектов установите все флажки и нажмите кнопку ОК:
В результате этого пакет NuGet будет добавлен в каждый проект в решении.
На Панели решения выберите проект 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, выбрав Файл > Сохранить (или нажав клавиши ⌘+S).
Предупреждение
В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.
На Панели решения добавьте новую папку с именем Data в проект Notes.
На Панели решения выберите проект Notes и добавьте новый класс с именем NoteDatabase в папку Data.
Замените содержимое файла 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<Note>().Wait(); } public Task<List<Note>> GetNotesAsync() { //Get all notes. return database.Table<Note>().ToListAsync(); } public Task<Note> GetNoteAsync(int id) { // Get a specific note. return database.Table<Note>() .Where(i => i.ID == id) .FirstOrDefaultAsync(); } public Task<int> 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<int> DeleteNoteAsync(Note note) { // Delete a note. return database.DeleteAsync(note); } } }
Этот класс содержит код, чтобы создать базу данных, считывать и записывать данные в ней, а также удалять данные из нее. В коде используются асинхронные API-интерфейсы SQLite.NET, которые перемещают операции базы данных в фоновые потоки. Кроме того конструктор
NoteDatabase
принимает путь файла базы данных в качестве аргумента. Этот путь будет предоставлен классомApp
в следующем шаге.Сохраните изменения в файле NoteDatabase.cs, выбрав Файл > Сохранить (или нажав клавиши ⌘+S).
Предупреждение
В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.
На Панели решения в проекте 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, выбрав Файл > Сохранить (или нажав клавиши ⌘+S).
Предупреждение
В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.
На Панели решения в проекте 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, выбрав Файл > Сохранить (или нажав клавиши ⌘+S).
Предупреждение
В данный момент сборка приложения не будет выполнена из-за ошибок, которые будут исправлены в последующих шагах.
На Панели решения разверните 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, выбрав Файл > Сохранить (или нажав клавиши ⌘+S).
Создайте и запустите проект на каждой соответствующей платформе. Дополнительные сведения см. в разделе Сборка примера из краткого руководства.
На странице NotesPage нажмите кнопку Добавить, чтобы перейти к странице NoteEntryPage и ввести заметку. После сохранения заметки приложение вернется на страницу NotesPage.
Введите несколько заметок разной длины, чтобы понаблюдать за поведением приложения. Закройте приложение и повторно запустите его, чтобы проверить, сохранены ли в базе данных введенные заметки.
Следующие шаги
Из этого руководства вы узнали, как выполнить следующие действия:
- Локальное хранение данных в базе данных SQLite.NET.
Перейдите к следующему краткому руководству, чтобы стилизовать приложение с помощью стилей XAML.