Ukládání dat v místní databázi SQLite.NET

Download Sample Stažení ukázky

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:

Notes PageNote Entry Page

Požadavky

Před pokusem o tento rychlý start byste měli úspěšně dokončit předchozí rychlý start . Případně si stáhněte předchozí ukázku rychlého startu a použijte ji jako výchozí bod pro tento rychlý start.

Aktualizace aplikace pomocí sady Visual Studio

  1. Spusťte Visual Studio a otevřete řešení Poznámek.

  2. 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í...:

    Manage NuGet Packages

  3. 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:

    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í:

    Select sqlite-net-pcl

    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.

  4. 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. Vlastnost ID je označena PrimaryKey atributy AutoIncrement 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.

  5. V Průzkumník řešení přidejte do projektu Poznámky novou složku s názvem Data.

  6. V Průzkumník řešení přidejte v projektu Notes novou třídu s názvem NoteDatabase do složky Data.

  7. 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 poskytne App 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.

  8. 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ří novou NoteDatabase instanci jako singleton a předá název souboru databáze jako argument konstruktoru NoteDatabase . 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.

  9. 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 a OnSelectionChanged 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. Metoda OnSelectionChanged přejde na NoteEntryPage, předává ID vlastnost vybraného Note 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.

  10. V Průzkumník řešení rozbalte NoteEntryPage.xaml ve složce Zobrazení a otevřete NoteEntryPage.xaml.cs. Pak nahraďte LoadNote, OnSaveButtonClickeda OnDeleteButtonClicked 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čte LoadNote poznámku z databáze, jejíž ID bylo předáno jako parametr dotazu na stránku, a uloží ji jako Note objekt na BindingContext stránce. OnSaveButtonClicked Při spuštění obslužné rutiny události se Note 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.

  11. 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

  1. Spusťte Visual Studio pro Mac a otevřete řešení Poznámek.

  2. V oblasti řešení klikněte pravým tlačítkem na řešení Poznámek a vyberte Spravovat balíčky NuGet...:

    Manage NuGet Packages

  3. 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:

    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í:

    Select sqlite-net-pcl

    Tento balíček poslouží k začlenění databázových operací do aplikace.

  4. V dialogovém okně Vybrat projekty se ujistěte, že je zaškrtnuté políčko, a stiskněte tlačítko OK :

    Add Package to All Projects

    Tím přidáte balíček NuGet do každého projektu v řešení.

  5. 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. Vlastnost ID je označena PrimaryKey atributy AutoIncrement 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.

  6. Na panelu řešení přidejte do projektu Poznámky novou složku s názvem Data.

  7. V oblasti řešení přidejte v projektu Notes novou třídu s názvem NoteDatabase do složky Data.

  8. 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 poskytne App 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.

  9. 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ří novou NoteDatabase instanci jako singleton a předá název souboru databáze jako argument konstruktoru NoteDatabase . 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.

  10. 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 a OnSelectionChanged 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. Metoda OnSelectionChanged přejde na NoteEntryPage, předává ID vlastnost vybraného Note 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.

  11. V oblasti řešení rozbalte NoteEntryPage.xaml ve složce Zobrazení a otevřete NoteEntryPage.xaml.cs. Pak nahraďte LoadNote, OnSaveButtonClickeda OnDeleteButtonClicked 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čte LoadNote poznámku z databáze, jejíž ID bylo předáno jako parametr dotazu na stránku, a uloží ji jako Note objekt na BindingContext stránce. OnSaveButtonClicked Při spuštění obslužné rutiny události se Note 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).

  12. 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.