Menyimpan data dalam database SQLite.NET lokal

Download Sample Mengunduh sampel

Dalam mulai cepat ini, Anda akan mempelajari cara:

  • Simpan data secara lokal dalam database SQLite.NET.

Mulai cepat menjelaskan cara menyimpan data dalam database SQLite.NET lokal, dari Xamarin.Forms aplikasi Shell. Aplikasi akhir ditunjukkan di bawah ini:

Notes PageNote Entry Page

Prasyarat

Anda harus berhasil menyelesaikan mulai cepat sebelumnya sebelum mencoba mulai cepat ini. Atau, unduh sampel mulai cepat sebelumnya dan gunakan sebagai titik awal untuk mulai cepat ini.

Memperbarui aplikasi dengan Visual Studio

  1. Luncurkan Visual Studio dan buka solusi Catatan.

  2. Di Penjelajah Solusi, klik kanan solusi Catatan dan pilih Kelola Paket NuGet untuk Solusi...:

    Manage NuGet Packages

  3. Di Manajer Paket NuGet, pilih tab Telusuri, dan cari paket NuGet sqlite-net-pcl.

    Peringatan

    Ada banyak paket NuGet dengan nama serupa. Paket yang benar memiliki atribut ini:

    Terlepas dari nama paket, paket NuGet ini dapat digunakan dalam proyek .NET Standard.

    Di Manajer Paket NuGet, pilih paket sqlite-net-pcl yang benar, centang kotak Centang proyek, dan klik tombol Instal untuk menambahkannya ke solusi:

    Select sqlite-net-pcl

    Paket ini akan digunakan untuk menggabungkan operasi database ke dalam aplikasi, dan akan ditambahkan ke setiap proyek dalam solusi.

    Penting

    SQLite.NET adalah pustaka pihak ketiga yang didukung dari repositori praeclarum/sqlite-net.

    Tutup Manajer Paket NuGet.

  4. Di Penjelajah Solusi, dalam proyek Catatan, buka Note.cs di folder Model dan ganti kode yang ada dengan kode berikut:

    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; }
        }
    }
    

    Kelas ini mendefinisikan Note model yang akan menyimpan data tentang setiap catatan dalam aplikasi. Properti ID ditandai dengan PrimaryKey atribut dan AutoIncrement untuk memastikan bahwa setiap Note instans dalam database SQLite.NET akan memiliki id unik yang disediakan oleh SQLite.NET.

    Simpan perubahan ke Note.cs dengan menekan CTRL+S.

    Peringatan

    Aplikasi saat ini tidak akan dibangun karena kesalahan yang akan diperbaiki dalam langkah-langkah berikutnya.

  5. Di Penjelajah Solusi, tambahkan folder baru bernama Data ke proyek Catatan.

  6. Di Penjelajah Solusi, dalam proyek Catatan, tambahkan kelas baru bernama NoteDatabase ke folder Data.

  7. Di NoteDatabase.cs, ganti kode yang ada dengan kode berikut:

    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);
            }
        }
    }
    

    Kelas ini berisi kode untuk membuat database, membaca data darinya, menulis data ke dalamnya, dan menghapus data darinya. Kode ini menggunakan API SQLite.NET asinkron yang memindahkan operasi database ke utas latar belakang. Selain itu, NoteDatabase konstruktor mengambil jalur file database sebagai argumen. Jalur ini akan disediakan oleh App kelas di langkah berikutnya.

    Simpan perubahan ke NoteDatabase.cs dengan menekan CTRL+S.

    Peringatan

    Aplikasi saat ini tidak akan dibangun karena kesalahan yang akan diperbaiki dalam langkah-langkah berikutnya.

  8. Di Penjelajah Solusi, dalam proyek Notes, perluas App.xaml dan klik dua kali App.xaml.cs untuk membukanya. Kemudian ganti kode yang ada dengan kode berikut:

    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()
            {
            }
        }
    }
    

    Kode ini mendefinisikan Database properti yang membuat instans baru NoteDatabase sebagai singleton, meneruskan nama file database sebagai argumen ke NoteDatabase konstruktor. Keuntungan mengekspos database sebagai singleton adalah bahwa koneksi database tunggal dibuat yang tetap terbuka saat aplikasi berjalan, oleh karena itu menghindari pengeluaran membuka dan menutup file database setiap kali operasi database dilakukan.

    Simpan perubahan ke App.xaml.cs dengan menekan CTRL+S.

    Peringatan

    Aplikasi saat ini tidak akan dibangun karena kesalahan yang akan diperbaiki dalam langkah-langkah berikutnya.

  9. Di Penjelajah Solusi, dalam proyek Catatan, perluas NotesPage.xaml di folder Tampilan dan buka NotesPage.xaml.cs. Kemudian ganti OnAppearing metode dan OnSelectionChanged dengan kode berikut:

    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()}");
        }
    }    
    

    Metode ini OnAppearing mengisi CollectionView dengan catatan apa pun yang disimpan dalam database. Metode OnSelectionChanged menavigasi ke NoteEntryPage, meneruskan ID properti objek yang dipilih Note sebagai parameter kueri.

    Simpan perubahan ke NotesPage.xaml.cs dengan menekan CTRL+S.

    Peringatan

    Aplikasi saat ini tidak akan dibangun karena kesalahan yang akan diperbaiki dalam langkah-langkah berikutnya.

  10. Di Penjelajah Solusi, perluas NoteEntryPage.xaml di folder Tampilan dan buka NoteEntryPage.xaml.cs. Kemudian ganti LoadNotemetode , OnSaveButtonClicked, dan OnDeleteButtonClicked dengan kode berikut:

    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("..");
    }
    

    menggunakan NoteEntryPageLoadNote metode untuk mengambil catatan dari database, yang ID-nya diteruskan sebagai parameter kueri ke halaman, dan menyimpannya sebagai Note objek di BindingContext halaman. OnSaveButtonClicked Saat penanganan aktivitas dijalankan, Note instans disimpan ke database dan aplikasi menavigasi kembali ke halaman sebelumnya. OnDeleteButtonClicked Saat penanganan aktivitas dijalankan, Note instans dihapus dari database dan aplikasi menavigasi kembali ke halaman sebelumnya.

    Simpan perubahan ke NoteEntryPage.xaml.cs dengan menekan CTRL+S.

  11. Bangun dan jalankan proyek di setiap platform. Untuk informasi selengkapnya, lihat Membangun mulai cepat.

    Pada NotesPage tekan tombol Tambahkan untuk menavigasi ke NoteEntryPage dan masukkan catatan. Setelah menyimpan catatan, aplikasi akan menavigasi kembali ke NotesPage.

    Masukkan beberapa catatan, dengan panjang yang bervariasi, untuk mengamati perilaku aplikasi. Tutup aplikasi dan luncurkan kembali untuk memastikan bahwa catatan yang Anda masukkan disimpan ke database.

Memperbarui aplikasi dengan Visual Studio untuk Mac

  1. Luncurkan Visual Studio untuk Mac dan buka solusi Catatan.

  2. Di Pad Solusi, klik kanan solusi Catatan dan pilih Kelola Paket NuGet...:

    Manage NuGet Packages

  3. Dalam dialog Kelola Paket NuGet, pilih tab Telusuri, dan cari paket NuGet sqlite-net-pcl.

    Peringatan

    Ada banyak paket NuGet dengan nama serupa. Paket yang benar memiliki atribut ini:

    Terlepas dari nama paket, paket NuGet ini dapat digunakan dalam proyek .NET Standard.

    Dalam dialog Kelola Paket NuGet, pilih paket sqlite-net-pcl, dan klik tombol Tambahkan Paket untuk menambahkannya ke solusi:

    Select sqlite-net-pcl

    Paket ini akan digunakan untuk menggabungkan operasi database ke dalam aplikasi.

  4. Dalam dialog Pilih Proyek, pastikan bahwa setiap kotak centang dicentang dan tekan tombol Ok:

    Add Package to All Projects

    Ini akan menambahkan paket NuGet ke setiap proyek dalam solusi.

  5. Di Solution Pad, dalam proyek Notes, buka Note.cs di folder Model dan ganti kode yang ada dengan kode berikut:

    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; }
        }
    }
    

    Kelas ini mendefinisikan Note model yang akan menyimpan data tentang setiap catatan dalam aplikasi. Properti ID ditandai dengan PrimaryKey atribut dan AutoIncrement untuk memastikan bahwa setiap Note instans dalam database SQLite.NET akan memiliki id unik yang disediakan oleh SQLite.NET.

    Simpan perubahan ke Note.cs dengan memilih Simpan File > (atau dengan menekan ⌘ + S).

    Peringatan

    Aplikasi saat ini tidak akan dibangun karena kesalahan yang akan diperbaiki dalam langkah-langkah berikutnya.

  6. Di Solution Pad, tambahkan folder baru bernama Data ke proyek Catatan .

  7. Di Pad Solusi, dalam proyek Catatan, tambahkan kelas baru bernama NoteDatabase ke folder Data.

  8. Di NoteDatabase.cs, ganti kode yang ada dengan kode berikut:

    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);
            }
        }
    }
    

    Kelas ini berisi kode untuk membuat database, membaca data darinya, menulis data ke dalamnya, dan menghapus data darinya. Kode ini menggunakan API SQLite.NET asinkron yang memindahkan operasi database ke utas latar belakang. Selain itu, NoteDatabase konstruktor mengambil jalur file database sebagai argumen. Jalur ini akan disediakan oleh App kelas di langkah berikutnya.

    Simpan perubahan ke NoteDatabase.cs dengan memilih Simpan File > (atau dengan menekan ⌘ + S).

    Peringatan

    Aplikasi saat ini tidak akan dibangun karena kesalahan yang akan diperbaiki dalam langkah-langkah berikutnya.

  9. Di Pad Solusi, dalam proyek Catatan, perluas App.xaml dan klik dua kali App.xaml.cs untuk membukanya. Kemudian ganti kode yang ada dengan kode berikut:

    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()
            {
            }
        }
    }
    

    Kode ini mendefinisikan Database properti yang membuat instans baru NoteDatabase sebagai singleton, meneruskan nama file database sebagai argumen ke NoteDatabase konstruktor. Keuntungan mengekspos database sebagai singleton adalah bahwa koneksi database tunggal dibuat yang tetap terbuka saat aplikasi berjalan, oleh karena itu menghindari pengeluaran membuka dan menutup file database setiap kali operasi database dilakukan.

    Simpan perubahan ke App.xaml.cs dengan memilih Simpan File > (atau dengan menekan ⌘ + S).

    Peringatan

    Aplikasi saat ini tidak akan dibangun karena kesalahan yang akan diperbaiki dalam langkah-langkah berikutnya.

  10. Di Pad Solusi, dalam proyek Catatan, perluas NotesPage.xaml di folder Tampilan dan buka NotesPage.xaml.cs. Kemudian ganti OnAppearing metode dan OnSelectionChanged dengan kode berikut:

    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()}");
        }
    }    
    

    Metode ini OnAppearing mengisi CollectionView dengan catatan apa pun yang disimpan dalam database. Metode OnSelectionChanged menavigasi ke NoteEntryPage, meneruskan ID properti objek yang dipilih Note sebagai parameter kueri.

    Simpan perubahan ke NotesPage.xaml.cs dengan memilih Simpan File > (atau dengan menekan ⌘ + S).

    Peringatan

    Aplikasi saat ini tidak akan dibangun karena kesalahan yang akan diperbaiki dalam langkah-langkah berikutnya.

  11. Di Pad Solusi, perluas NoteEntryPage.xaml di folder Tampilan dan buka NoteEntryPage.xaml.cs. Kemudian ganti LoadNotemetode , OnSaveButtonClicked, dan OnDeleteButtonClicked dengan kode berikut:

    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("..");
    }
    

    menggunakan NoteEntryPageLoadNote metode untuk mengambil catatan dari database, yang ID-nya diteruskan sebagai parameter kueri ke halaman, dan menyimpannya sebagai Note objek di BindingContext halaman. OnSaveButtonClicked Saat penanganan aktivitas dijalankan, Note instans disimpan ke database dan aplikasi menavigasi kembali ke halaman sebelumnya. OnDeleteButtonClicked Saat penanganan aktivitas dijalankan, Note instans dihapus dari database dan aplikasi menavigasi kembali ke halaman sebelumnya.

    Simpan perubahan ke NoteEntryPage.xaml.cs dengan memilih Simpan File > (atau dengan menekan ⌘ + S).

  12. Bangun dan jalankan proyek di setiap platform. Untuk informasi selengkapnya, lihat Membangun mulai cepat.

    Pada NotesPage tekan tombol Tambahkan untuk menavigasi ke NoteEntryPage dan masukkan catatan. Setelah menyimpan catatan, aplikasi akan menavigasi kembali ke NotesPage.

    Masukkan beberapa catatan, dengan panjang yang bervariasi, untuk mengamati perilaku aplikasi. Tutup aplikasi dan luncurkan kembali untuk memastikan bahwa catatan yang Anda masukkan disimpan ke database.

Langkah berikutnya

Dalam mulai cepat ini, Anda belajar cara:

  • Simpan data secara lokal dalam database SQLite.NET.

Lanjutkan ke mulai cepat berikutnya untuk menata aplikasi dengan gaya XAML.