Хранение данных в локальной базе данных SQLite.NETStore Data in a Local SQLite.NET Database

Скачать пример Скачать примерDownload Sample Download the sample

В этом кратком руководстве вы узнаете, как выполнять следующие задачи:In this quickstart, you will learn how to:

  • Используйте диспетчер пакетов NuGet, чтобы добавить пакет NuGet в проект.Use the NuGet Package Manager to add a NuGet package to a project.
  • Храните данные локально в базе данных SQLite.NET.Store data locally in a SQLite.NET database.

Краткое руководство посвящено хранению данных в локальной базе данных SQLite.NET.The quickstart walks through how to store data in a local SQLite.NET database. Ниже показано итоговое приложение:The final application is shown below:

Страница «заметки» [ ![(database-images/screenshots1-sml.png " ")]] (database-images/screenshots1.png#lightbox "Страница «заметки»") Страница ввода примечания страница(database-images/screenshots2.png#lightbox "записи примечания") [ ![(database-images/screenshots2-sml.png " ")]]

Предварительные требованияPrerequisites

Перед выполнением этого краткого руководства необходимо успешно выполнить предыдущее краткое руководство .You should successfully complete the previous quickstart before attempting this quickstart. Также можно скачать предыдущий пример краткого руководства и использовать его в качестве отправной точки для этого краткого руководства.Alternatively, download the previous quickstart sample and use it as the starting point for this quickstart.

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

  1. Запустите Visual Studio и откройте решение Notes.Launch Visual Studio and open the Notes solution.

  2. В Обозреватель решенийвыберите проект Notes , щелкните правой кнопкой мыши и выберите пункт Управление пакетами NuGet... :In Solution Explorer, select the Notes project, right-click and select Manage NuGet Packages...:

  3. В разделе Диспетчер пакетов NuGet выберите вкладку Обзор, выполните поиск пакета NuGet sqlite-net-pcl, выберите его и нажмите кнопку Установить, чтобы добавить его в проект.In the NuGet Package Manager, select the Browse tab, search for the sqlite-net-pcl NuGet package, select it, and click the Install button to add it to the project:

    Примечание

    Существует ряд пакетов NuGet с похожими названиями.There are a number of NuGet packages with similar names. Правильный пакет имеет следующие атрибуты:The correct package has these attributes:

    • Автор(ы) : Фрэнк А. Крюгер (Frank A. Krueger)Author(s): Frank A. Krueger
    • Идентификатор: sqlite-net-pclId: sqlite-net-pcl
    • Ссылка в NuGet: sqlite-net-pclNuGet link: sqlite-net-pcl

    Несмотря на название, этот пакет NuGet можно использовать в проектах .NET Standard.Despite the package name, this NuGet package can be used in .NET Standard projects.

    Этот пакет будет использоваться для включения операций базы данных в приложение.This package will be used to incorporate database operations into the application.

  4. В Обозреватель решенийв проекте Notes откройте Note.CS в папке Models и замените существующий код следующим кодом:In Solution Explorer, in the Notes project, open Note.cs in the Models folder and replace the existing code with the following code:

    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 модель, которая будет хранить данные о каждой заметке в приложении.This class defines a Note model that will store data about each note in the application. Свойство помечается атрибутами AutoIncrement Note и, чтобы гарантировать, что каждый экземпляр в базе данных SQLite.NET будет иметь уникальный идентификатор, предоставленный SQLite.NET. PrimaryKey IDThe ID property is marked with PrimaryKey and AutoIncrement attributes to ensure that each Note instance in the SQLite.NET database will have a unique id provided by SQLite.NET.

    Сохраните изменения в Note.CS , нажав клавиши CTRL + S, и закройте файл.Save the changes to Note.cs by pressing CTRL+S, and close the file.

    Предупреждение

    Попытка создать приложение на этом этапе приведет к ошибкам, которые будут исправлены в последующих шагах.Attempting to build the application at this point will result in errors that will be fixed in subsequent steps.

  5. В Обозреватель решенийдобавьте новую папку с именем Data в проект notess .In Solution Explorer, add a new folder named Data to the Notes project.

  6. В Обозреватель решенийв проекте Notes добавьте новый класс с именем нотедатабасе в папку Data .In Solution Explorer, in the Notes project, add a new class named NoteDatabase to the Data folder.

  7. В NoteDatabase.CSзамените существующий код следующим кодом:In NoteDatabase.cs, replace the existing code with the following code:

    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()
            {
                return _database.Table<Note>().ToListAsync();
            }
    
            public Task<Note> GetNoteAsync(int id)
            {
                return _database.Table<Note>()
                                .Where(i => i.ID == id)
                                .FirstOrDefaultAsync();
            }
    
            public Task<int> SaveNoteAsync(Note note)
            {
                if (note.ID != 0)
                {
                    return _database.UpdateAsync(note);
                }
                else
                {
                    return _database.InsertAsync(note);
                }
            }
    
            public Task<int> DeleteNoteAsync(Note note)
            {
                return _database.DeleteAsync(note);
            }
        }
    }
    

    Этот класс содержит код для создания базы данных, считывания данных из нее, записи данных в нее и удаления данных из нее.This class contains code to create the database, read data from it, write data to it, and delete data from it. В коде используются асинхронные API-интерфейсы SQLite.NET, которые перемещают операции базы данных в фоновые потоки.The code uses asynchronous SQLite.NET APIs that move database operations to background threads. Кроме того конструктор NoteDatabase принимает путь файла базы данных в качестве аргумента.In addition, the NoteDatabase constructor takes the path of the database file as an argument. Этот путь будет предоставлен App классом на следующем шаге.This path will be provided by the App class in the next step.

    Сохраните изменения в NoteDatabase.CS , нажав клавиши CTRL + S, и закройте файл.Save the changes to NoteDatabase.cs by pressing CTRL+S, and close the file.

    Предупреждение

    Попытка создать приложение на этом этапе приведет к ошибкам, которые будут исправлены в последующих шагах.Attempting to build the application at this point will result in errors that will be fixed in subsequent steps.

  8. В Обозреватель решенийв проекте Notes дважды щелкните app.XAML.CS , чтобы открыть его.In Solution Explorer, in the Notes project, double-click App.xaml.cs to open it. Затем замените существующий код следующим кодом:Then replace the existing code with the following code:

    using System;
    using System.IO;
    using Xamarin.Forms;
    using Notes.Data;
    
    namespace Notes
    {
        public partial class App : Application
        {
            static NoteDatabase database;
    
            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 NavigationPage(new NotesPage());
            }
    
            protected override void OnStart()
            {
                // Handle when your app starts
            }
    
            protected override void OnSleep()
            {
                // Handle when your app sleeps
            }
    
            protected override void OnResume()
            {
                // Handle when your app resumes
            }
        }
    }
    

    Этот код определяет Database свойство, которое создает новый NoteDatabase экземпляр в виде одноэлементного массива, передавая имя файла базы данных в NoteDatabase качестве аргумента в конструктор.This code defines a Database property that creates a new NoteDatabase instance as a singleton, passing in the filename of the database as the argument to the NoteDatabase constructor. Преимущество использования отдельной базы данных в том, что создается отдельное подключение к базе данных, которое остается открытым, пока работает приложение. Это позволяет избежать затрат, связанных с открытием и закрытием файла базы данных каждый раз, когда выполняется операция с ней.The advantage of exposing the database as a singleton is that a single database connection is created that's kept open while the application runs, therefore avoiding the expense of opening and closing the database file each time a database operation is performed.

    Сохраните изменения в файле App.xaml.cs, нажав клавиши CTRL+S, и закройте файл.Save the changes to App.xaml.cs by pressing CTRL+S, and close the file.

    Предупреждение

    Попытка создать приложение на этом этапе приведет к ошибкам, которые будут исправлены в последующих шагах.Attempting to build the application at this point will result in errors that will be fixed in subsequent steps.

  9. В Обозреватель решенийв проекте Notes дважды щелкните NotesPage.XAML.CS , чтобы открыть его.In Solution Explorer, in the Notes project, double-click NotesPage.xaml.cs to open it. Затем замените OnAppearing метод следующим кодом:Then replace the OnAppearing method with the following code:

    protected override async void OnAppearing()
    {
        base.OnAppearing();
    
        listView.ItemsSource = await App.Database.GetNotesAsync();
    }
    

    Этот код заполняет ListView с помощью любых заметок, хранящихся в базе данных.This code populates the ListView with any notes stored in the database.

    Сохраните изменения в NotesPage.XAML.CS , нажав клавиши CTRL + S, и закройте файл.Save the changes to NotesPage.xaml.cs by pressing CTRL+S, and close the file.

    Предупреждение

    Попытка создать приложение на этом этапе приведет к ошибкам, которые будут исправлены в последующих шагах.Attempting to build the application at this point will result in errors that will be fixed in subsequent steps.

  10. В Обозреватель решенийдважды щелкните NoteEntryPage.XAML.CS , чтобы открыть его.In Solution Explorer, double-click NoteEntryPage.xaml.cs to open it. Затем замените OnSaveButtonClicked методы и OnDeleteButtonClicked следующим кодом:Then replace the OnSaveButtonClicked and OnDeleteButtonClicked methods with the following code:

    async void OnSaveButtonClicked(object sender, EventArgs e)
    {
        var note = (Note)BindingContext;
        note.Date = DateTime.UtcNow;
        await App.Database.SaveNoteAsync(note);
        await Navigation.PopAsync();
    }
    
    async void OnDeleteButtonClicked(object sender, EventArgs e)
    {
        var note = (Note)BindingContext;
        await App.Database.DeleteNoteAsync(note);
        await Navigation.PopAsync();
    }
    

    Объект NoteEntryPage BindingContext хранит экземпляр, представляющий отдельную заметку, на странице. NoteThe NoteEntryPage stores a Note instance, which represents a single note, in the BindingContext of the page. При выполненииNote обработчика событийэкземплярсохраняетсявбазеданных,иприложениепереходитнаOnSaveButtonClicked предыдущую страницу.When the OnSaveButtonClicked event handler is executed, the Note instance is saved to the database and the application navigates back to the previous page. При выполненииNote обработчика событийэкземплярудаляетсяизбазыданных,иприложениепереходитнаOnDeleteButtonClicked предыдущую страницу.When the OnDeleteButtonClicked event handler is executed, the Note instance is deleted from the database and the application navigates back to the previous page.

    Сохраните изменения в NoteEntryPage.XAML.CS , нажав клавиши CTRL + S, и закройте файл.Save the changes to NoteEntryPage.xaml.cs by pressing CTRL+S, and close the file.

  11. Создайте и запустите проект на каждой платформе.Build and run the project on each platform. Дополнительные сведения см. в разделе Создание краткого руководства.For more information, see Building the quickstart.

    В нотеспаже нажмите + кнопку, чтобы перейти к нотинтрипаже и ввести Примечание.On the NotesPage press the + button to navigate to the NoteEntryPage and enter a note. После сохранения примечания приложение вернется обратно к нотеспаже.After saving the note the application will navigate back to the NotesPage.

    Введите число заметок, отличающихся длиной, для отслеживания поведения приложения.Enter a number of notes, of varying length, to observe the application behavior.

Обновление приложения с помощью Visual Studio для MacUpdate the app with Visual Studio for Mac

  1. Запустите Visual Studio для Mac и откройте проект Notes.Launch Visual Studio for Mac and open the Notes project.

  2. В панель решениявыберите проект Notes , щелкните правой кнопкой мыши и выберите Добавить > Добавить пакеты NuGet... :In the Solution Pad, select the Notes project, right-click and select Add > Add NuGet Packages...:

  3. В окне Добавление пакетов выполните поиск пакета NuGet sqlite-net-pcl, выберите его и нажмите кнопку Добавить пакет, чтобы добавить его в проект.In the Add Packages window, search for the sqlite-net-pcl NuGet package, select it, and click the Add Package button to add it to the project:

    Примечание

    Существует ряд пакетов NuGet с похожими названиями.There are a number of NuGet packages with similar names. Правильный пакет имеет следующие атрибуты:The correct package has these attributes:

    • Автор: Фрэнк А. Крюгер (Frank A. Krueger)Author: Frank A. Krueger
    • Идентификатор: sqlite-net-pclId: sqlite-net-pcl
    • Ссылка в NuGet: sqlite-net-pclNuGet link: sqlite-net-pcl

    Несмотря на название, этот пакет NuGet можно использовать в проектах .NET Standard.Despite the package name, this NuGet package can be used in .NET Standard projects.

    Этот пакет будет использоваться для включения операций базы данных в приложение.This package will be used to incorporate database operations into the application.

  4. В панель решенияв проекте Notes откройте Note.CS в папке Models и замените существующий код следующим кодом:In the Solution Pad, in the Notes project, open Note.cs in the Models folder and replace the existing code with the following code:

    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 модель, которая будет хранить данные о каждой заметке в приложении.This class defines a Note model that will store data about each note in the application. Свойство помечается атрибутами AutoIncrement Note и, чтобы гарантировать, что каждый экземпляр в базе данных SQLite.NET будет иметь уникальный идентификатор, предоставленный SQLite.NET. PrimaryKey IDThe ID property is marked with PrimaryKey and AutoIncrement attributes to ensure that each Note instance in the SQLite.NET database will have a unique id provided by SQLite.NET.

    Сохраните изменения в Note.CS , выбрав Файл > Сохранить (или нажав клавиши ⌘ + S) и закройте файл.Save the changes to Note.cs by choosing File > Save (or by pressing ⌘ + S), and close the file.

    Предупреждение

    Попытка создать приложение на этом этапе приведет к ошибкам, которые будут исправлены в последующих шагах.Attempting to build the application at this point will result in errors that will be fixed in subsequent steps.

  5. В панель решениядобавьте новую папку с именем Data в проект notess .In the Solution Pad, add a new folder named Data to the Notes project.

  6. В панель решенияв проекте Notes добавьте новый класс с именем нотедатабасе в папку Data .In the Solution Pad, in the Notes project, add a new class named NoteDatabase to the Data folder.

  7. В NoteDatabase.CSзамените существующий код следующим кодом:In NoteDatabase.cs, replace the existing code with the following code:

    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()
            {
                return _database.Table<Note>().ToListAsync();
            }
    
            public Task<Note> GetNoteAsync(int id)
            {
                return _database.Table<Note>()
                                .Where(i => i.ID == id)
                                .FirstOrDefaultAsync();
            }
    
            public Task<int> SaveNoteAsync(Note note)
            {
                if (note.ID != 0)
                {
                    return _database.UpdateAsync(note);
                }
                else
                {
                    return _database.InsertAsync(note);
                }
            }
    
            public Task<int> DeleteNoteAsync(Note note)
            {
                return _database.DeleteAsync(note);
            }
        }
    }
    

    Этот класс содержит код для создания базы данных, считывания данных из нее, записи данных в нее и удаления данных из нее.This class contains code to create the database, read data from it, write data to it, and delete data from it. В коде используются асинхронные API-интерфейсы SQLite.NET, которые перемещают операции базы данных в фоновые потоки.The code uses asynchronous SQLite.NET APIs that move database operations to background threads. Кроме того конструктор NoteDatabase принимает путь файла базы данных в качестве аргумента.In addition, the NoteDatabase constructor takes the path of the database file as an argument. Этот путь будет предоставлен App классом на следующем шаге.This path will be provided by the App class in the next step.

    Сохраните изменения в NoteDatabase.CS , выбрав Файл > Сохранить (или нажав клавиши ⌘ + S) и закройте файл.Save the changes to NoteDatabase.cs by choosing File > Save (or by pressing ⌘ + S), and close the file.

    Предупреждение

    Попытка создать приложение на этом этапе приведет к ошибкам, которые будут исправлены в последующих шагах.Attempting to build the application at this point will result in errors that will be fixed in subsequent steps.

  8. В панель решенияв проекте Notes дважды щелкните app.XAML.CS , чтобы открыть его.In the Solution Pad, in the Notes project, double-click App.xaml.cs to open it. Затем замените существующий код следующим кодом:Then replace the existing code with the following code:

    using System;
    using System.IO;
    using Xamarin.Forms;
    using Notes.Data;
    
    namespace Notes
    {
        public partial class App : Application
        {
            static NoteDatabase database;
    
            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 NavigationPage(new NotesPage());
            }
    
            protected override void OnStart()
            {
                // Handle when your app starts
            }
    
            protected override void OnSleep()
            {
                // Handle when your app sleeps
            }
    
            protected override void OnResume()
            {
                // Handle when your app resumes
            }
        }
    }
    

    Этот код определяет Database свойство, которое создает новый NoteDatabase экземпляр в виде одноэлементного массива, передавая имя файла базы данных в NoteDatabase качестве аргумента в конструктор.This code defines a Database property that creates a new NoteDatabase instance as a singleton, passing in the filename of the database as the argument to the NoteDatabase constructor. Преимущество использования отдельной базы данных в том, что создается отдельное подключение к базе данных, которое остается открытым, пока работает приложение. Это позволяет избежать затрат, связанных с открытием и закрытием файла базы данных каждый раз, когда выполняется операция с ней.The advantage of exposing the database as a singleton is that a single database connection is created that's kept open while the application runs, therefore avoiding the expense of opening and closing the database file each time a database operation is performed.

    Сохраните изменения в файле App.xaml.cs, выбрав Файл > Сохранить или нажав клавиши ⌘+S, и закройте файл.Save the changes to App.xaml.cs by choosing File > Save (or by pressing ⌘ + S), and close the file.

    Предупреждение

    Попытка создать приложение на этом этапе приведет к ошибкам, которые будут исправлены в последующих шагах.Attempting to build the application at this point will result in errors that will be fixed in subsequent steps.

  9. В панель решенияв проекте Notes дважды щелкните NotesPage.XAML.CS , чтобы открыть его.In the Solution Pad, in the Notes project, double-click NotesPage.xaml.cs to open it. Затем замените OnAppearing метод следующим кодом:Then replace the OnAppearing method with the following code:

    protected override async void OnAppearing()
    {
        base.OnAppearing();
    
        listView.ItemsSource = await App.Database.GetNotesAsync();
    }
    

    Этот код заполняет ListView с помощью любых заметок, хранящихся в базе данных.This code populates the ListView with any notes stored in the database.

    Сохраните изменения в NotesPage.XAML.CS , выбрав Файл > Сохранить (или нажав клавиши ⌘ + S) и закройте файл.Save the changes to NotesPage.xaml.cs by choosing File > Save (or by pressing ⌘ + S), and close the file.

    Предупреждение

    Попытка создать приложение на этом этапе приведет к ошибкам, которые будут исправлены в последующих шагах.Attempting to build the application at this point will result in errors that will be fixed in subsequent steps.

  10. В панель решениядважды щелкните NoteEntryPage.XAML.CS , чтобы открыть его.In the Solution Pad, double-click NoteEntryPage.xaml.cs to open it. Затем замените OnSaveButtonClicked методы и OnDeleteButtonClicked следующим кодом:Then replace the OnSaveButtonClicked and OnDeleteButtonClicked methods with the following code:

    async void OnSaveButtonClicked(object sender, EventArgs e)
    {
        var note = (Note)BindingContext;
        note.Date = DateTime.UtcNow;
        await App.Database.SaveNoteAsync(note);
        await Navigation.PopAsync();
    }
    
    async void OnDeleteButtonClicked(object sender, EventArgs e)
    {
        var note = (Note)BindingContext;
        await App.Database.DeleteNoteAsync(note);
        await Navigation.PopAsync();
    }
    

    Объект NoteEntryPage BindingContext хранит экземпляр, представляющий отдельную заметку, на странице. NoteThe NoteEntryPage stores a Note instance, which represents a single note, in the BindingContext of the page. При выполненииNote обработчика событийэкземплярсохраняетсявбазеданных,иприложениепереходитнаOnSaveButtonClicked предыдущую страницу.When the OnSaveButtonClicked event handler is executed, the Note instance is saved to the database and the application navigates back to the previous page. При выполненииNote обработчика событийэкземплярудаляетсяизбазыданных,иприложениепереходитнаOnDeleteButtonClicked предыдущую страницу.When the OnDeleteButtonClicked event handler is executed, the Note instance is deleted from the database and the application navigates back to the previous page.

    Сохраните изменения в NoteEntryPage.XAML.CS , выбрав Файл > Сохранить (или нажав клавиши ⌘ + S) и закройте файл.Save the changes to NoteEntryPage.xaml.cs by choosing File > Save (or by pressing ⌘ + S), and close the file.

  11. Создайте и запустите проект на каждой платформе.Build and run the project on each platform. Дополнительные сведения см. в разделе Создание краткого руководства.For more information, see Building the quickstart.

    В нотеспаже нажмите + кнопку, чтобы перейти к нотинтрипаже и ввести Примечание.On the NotesPage press the + button to navigate to the NoteEntryPage and enter a note. После сохранения примечания приложение вернется обратно к нотеспаже.After saving the note the application will navigate back to the NotesPage.

    Введите число заметок, отличающихся длиной, для отслеживания поведения приложения.Enter a number of notes, of varying length, to observe the application behavior.

Следующие шагиNext steps

В этом кратком руководстве вы узнали, как выполнять следующие задачи:In this quickstart, you learned how to:

  • Используйте диспетчер пакетов NuGet, чтобы добавить пакет NuGet в проект.Use the NuGet Package Manager to add a NuGet package to a project.
  • Храните данные локально в базе данных SQLite.NET.Store data locally in a SQLite.NET database.

Чтобы присвоить стилю приложения стили XAML, перейдите к следующему краткому руководству.To style the application with XAML styles, continue to the next quickstart.