Ukládání dat v místní databázi SQLite.NET
V tomto rychlém startu se naučíte:
- Data můžete ukládat místně do databáze SQLite.NET.
Rychlý start vás provede uložením dat v místní SQLite.NET databázi z Xamarin.Forms aplikace Shell. Poslední aplikace je znázorněná níže:
Požadavky
Před pokusem o tento rychlý start byste měli úspěšně dokončit předchozí rychlý start .
Aktualizace aplikace pomocí sady Visual Studio
Spusťte Visual Studio a otevřete řešení Poznámek.
V Průzkumník řešení klikněte pravým tlačítkem na řešení Poznámek a vyberte Spravovat balíčky NuGet pro řešení...:
V Správce balíčků NuGet vyberte kartu Procházet a vyhledejte balíček NuGet sqlite-net-pcl.
Upozorňující
Existuje mnoho balíčků NuGet s podobnými názvy. Správný balíček má tyto atributy:
- Autoři: SQLite-net
- Odkaz na NuGet: sqlite-net-pcl
Bez ohledu na název balíčku je možné tento balíček NuGet použít v projektech .NET Standard.
V Správce balíčků NuGet vyberte správný balíček sqlite-net-pcl, zaškrtněte políčko Projekt a kliknutím na tlačítko Nainstalovat ho přidejte do řešení:
Tento balíček se použije k začlenění databázových operací do aplikace a přidá se do každého projektu v řešení.
Důležité
SQLite.NET je knihovna třetí strany podporovaná z úložiště praeclarum/sqlite-net.
Zavřete Správce balíčků NuGet.
V Průzkumník řešení otevřete v projektu Notes Note.cs ve složce Models a nahraďte stávající kód následujícím kódem:
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; } } }
Tato třída definuje
Note
model, který bude ukládat data o každé poznámce v aplikaci. VlastnostID
je označenaPrimaryKey
atributyAutoIncrement
a zajišťuje, aby každáNote
instance v databázi SQLite.NET měla jedinečné ID poskytnuté SQLite.NET.Uložte změny Note.cs stisknutím kombinace kláves CTRL+S.
Upozorňující
Aplikace se v současné době nebude sestavovat kvůli chybám, které budou opraveny v následných krocích.
V Průzkumník řešení přidejte do projektu Poznámky novou složku s názvem Data.
V Průzkumník řešení přidejte v projektu Notes novou třídu s názvem NoteDatabase do složky Data.
V NoteDatabase.cs nahraďte stávající kód následujícím kódem:
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); } } }
Tato třída obsahuje kód pro vytvoření databáze, čtení dat z ní, zápis dat a odstranění dat z ní. Tento kód používá asynchronní rozhraní API SQLite.NET, která přesouvají databázové operace na vlákna na pozadí. Konstruktor třídy
NoteDatabase
kromě toho přijímá jako argument cestu k souboru databáze. Tuto cestu poskytneApp
třída v dalším kroku.Uložte změny do NoteDatabase.cs stisknutím kombinace kláves CTRL+S.
Upozorňující
Aplikace se v současné době nebude sestavovat kvůli chybám, které budou opraveny v následných krocích.
V Průzkumník řešení rozbalte v projektu Poznámky app.xaml a poklikáním otevřete App.xaml.cs. Potom nahraďte stávající kód následujícím kódem:
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() { } } }
Tento kód definuje
Database
vlastnost, která vytvoří novouNoteDatabase
instanci jako singleton a předá název souboru databáze jako argument konstruktoruNoteDatabase
. Výhodou vystavení databáze jako jednoúčelové je to, že se vytvoří jedno připojení k databázi, které zůstává otevřené po dobu běhu aplikace, takže není nutné při provádění každé databázové operace otevírat a zavírat soubor databáze.Uložte změny App.xaml.cs stisknutím kombinace kláves CTRL+S.
Upozorňující
Aplikace se v současné době nebude sestavovat kvůli chybám, které budou opraveny v následných krocích.
V Průzkumník řešení rozbalte v projektu Notespage.xaml ve složce Zobrazení a otevřete NotesPage.xaml.cs. Pak nahraďte
OnAppearing
aOnSelectionChanged
metody následujícím kódem: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()}"); } }
Metoda
OnAppearing
naplníCollectionView
všechny poznámky uložené v databázi. MetodaOnSelectionChanged
přejde naNoteEntryPage
, předáváID
vlastnost vybranéhoNote
objektu jako parametr dotazu.Uložte změny NotesPage.xaml.cs stisknutím kombinace kláves CTRL+S.
Upozorňující
Aplikace se v současné době nebude sestavovat kvůli chybám, které budou opraveny v následných krocích.
V Průzkumník řešení rozbalte NoteEntryPage.xaml ve složce Zobrazení a otevřete NoteEntryPage.xaml.cs. Pak nahraďte
LoadNote
,OnSaveButtonClicked
aOnDeleteButtonClicked
metody následujícím kódem: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(".."); }
Pomocí
NoteEntryPage
metody načteLoadNote
poznámku z databáze, jejíž ID bylo předáno jako parametr dotazu na stránku, a uloží ji jakoNote
objekt naBindingContext
stránce.OnSaveButtonClicked
Při spuštění obslužné rutiny události seNote
instance uloží do databáze a aplikace přejde zpět na předchozí stránku.OnDeleteButtonClicked
Při spuštěníNote
obslužné rutiny události se instance odstraní z databáze a aplikace přejde zpět na předchozí stránku.Uložte změny NoteEntryPage.xaml.cs stisknutím kombinace kláves CTRL+S.
Sestavte a spusťte projekt na jednotlivých platformách. Další informace najdete v tématu Sestavení rychlého startu.
Na stránce NotesPage stiskněte tlačítko Přidat, přejděte na NoteEntryPage a zadejte poznámku. Po uložení poznámky aplikace přejde zpět na NotesPage.
Zadejte několik poznámek s různou délkou, abyste mohli sledovat chování aplikace. Zavřete aplikaci a znovu ji spusťte, abyste měli jistotu, že se zadané poznámky uložily do databáze.
Aktualizace aplikace pomocí Visual Studio pro Mac
Spusťte Visual Studio pro Mac a otevřete řešení Poznámek.
V oblasti řešení klikněte pravým tlačítkem na řešení Poznámek a vyberte Spravovat balíčky NuGet...:
V dialogovém okně Spravovat balíčky NuGet vyberte kartu Procházet a vyhledejte balíček NuGet sqlite-net-pcl.
Upozorňující
Existuje mnoho balíčků NuGet s podobnými názvy. Správný balíček má tyto atributy:
- Autoři: SQLite-net
- Odkaz na NuGet: sqlite-net-pcl
Bez ohledu na název balíčku je možné tento balíček NuGet použít v projektech .NET Standard.
V dialogovém okně Spravovat balíčky NuGet vyberte balíček sqlite-net-pcl a kliknutím na tlačítko Přidat balíček přidejte do řešení:
Tento balíček poslouží k začlenění databázových operací do aplikace.
V dialogovém okně Vybrat projekty se ujistěte, že je zaškrtnuté políčko, a stiskněte tlačítko OK :
Tím přidáte balíček NuGet do každého projektu v řešení.
V oblasti řešení otevřete v projektu Poznámky Note.cs ve složce Models a nahraďte stávající kód následujícím kódem:
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; } } }
Tato třída definuje
Note
model, který bude ukládat data o každé poznámce v aplikaci. VlastnostID
je označenaPrimaryKey
atributyAutoIncrement
a zajišťuje, aby každáNote
instance v databázi SQLite.NET měla jedinečné ID poskytnuté SQLite.NET.Uložte změny do Note.cs tak, že zvolíte Uložit soubor > (nebo stisknete ⌘ + S).
Upozorňující
Aplikace se v současné době nebude sestavovat kvůli chybám, které budou opraveny v následných krocích.
Na panelu řešení přidejte do projektu Poznámky novou složku s názvem Data.
V oblasti řešení přidejte v projektu Notes novou třídu s názvem NoteDatabase do složky Data.
V NoteDatabase.cs nahraďte stávající kód následujícím kódem:
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); } } }
Tato třída obsahuje kód pro vytvoření databáze, čtení dat z ní, zápis dat a odstranění dat z ní. Tento kód používá asynchronní rozhraní API SQLite.NET, která přesouvají databázové operace na vlákna na pozadí. Konstruktor třídy
NoteDatabase
kromě toho přijímá jako argument cestu k souboru databáze. Tuto cestu poskytneApp
třída v dalším kroku.Uložte změny do NoteDatabase.cs tak, že zvolíte Uložit soubor > (nebo stisknete ⌘ + S).
Upozorňující
Aplikace se v současné době nebude sestavovat kvůli chybám, které budou opraveny v následných krocích.
V oblasti řešení v projektu Poznámky rozbalte App.xaml a poklikáním otevřete App.xaml.cs. Potom nahraďte stávající kód následujícím kódem:
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() { } } }
Tento kód definuje
Database
vlastnost, která vytvoří novouNoteDatabase
instanci jako singleton a předá název souboru databáze jako argument konstruktoruNoteDatabase
. Výhodou vystavení databáze jako jednoúčelové je to, že se vytvoří jedno připojení k databázi, které zůstává otevřené po dobu běhu aplikace, takže není nutné při provádění každé databázové operace otevírat a zavírat soubor databáze.Uložte změny do App.xaml.cs výběrem možnosti Uložit soubor > (nebo stisknutím ⌘ + S).
Upozorňující
Aplikace se v současné době nebude sestavovat kvůli chybám, které budou opraveny v následných krocích.
V oblasti řešení v projektu Poznámky rozbalte poznámky.xaml ve složce Zobrazení a otevřete NotesPage.xaml.cs. Pak nahraďte
OnAppearing
aOnSelectionChanged
metody následujícím kódem: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()}"); } }
Metoda
OnAppearing
naplníCollectionView
všechny poznámky uložené v databázi. MetodaOnSelectionChanged
přejde naNoteEntryPage
, předáváID
vlastnost vybranéhoNote
objektu jako parametr dotazu.Uložte změny do NotesPage.xaml.cs výběrem možnosti Uložit soubor > (nebo stisknutím ⌘ + S).
Upozorňující
Aplikace se v současné době nebude sestavovat kvůli chybám, které budou opraveny v následných krocích.
V oblasti řešení rozbalte NoteEntryPage.xaml ve složce Zobrazení a otevřete NoteEntryPage.xaml.cs. Pak nahraďte
LoadNote
,OnSaveButtonClicked
aOnDeleteButtonClicked
metody následujícím kódem: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(".."); }
Pomocí
NoteEntryPage
metody načteLoadNote
poznámku z databáze, jejíž ID bylo předáno jako parametr dotazu na stránku, a uloží ji jakoNote
objekt naBindingContext
stránce.OnSaveButtonClicked
Při spuštění obslužné rutiny události seNote
instance uloží do databáze a aplikace přejde zpět na předchozí stránku.OnDeleteButtonClicked
Při spuštěníNote
obslužné rutiny události se instance odstraní z databáze a aplikace přejde zpět na předchozí stránku.Uložte změny do NoteEntryPage.xaml.cs tak, že zvolíte Uložit soubor > (nebo stisknete ⌘ + S).
Sestavte a spusťte projekt na jednotlivých platformách. Další informace najdete v tématu Sestavení rychlého startu.
Na stránce NotesPage stiskněte tlačítko Přidat, přejděte na NoteEntryPage a zadejte poznámku. Po uložení poznámky aplikace přejde zpět na NotesPage.
Zadejte několik poznámek s různou délkou, abyste mohli sledovat chování aplikace. Zavřete aplikaci a znovu ji spusťte, abyste měli jistotu, že se zadané poznámky uložily do databáze.
Další kroky
V tomto rychlém startu jste se naučili:
- Data můžete ukládat místně do databáze SQLite.NET.
Pokračujte k dalšímu rychlému startu a napište styl aplikace pomocí stylů XAML.