Latihan: Menyimpan data secara lokal dengan SQLite

Selesai

Dalam latihan ini, Anda akan menggunakan SQLite untuk menyimpan informasi secara lokal dengan aplikasi. Dalam skenario sampel, Anda memutuskan untuk menyimpan data untuk aplikasi media sosial untuk meningkatkan responsivitas. Latihan ini membuat dan menggunakan database SQLite lokal untuk menyimpan informasi tentang orang. Anda akan menyimpan file database fisik di penyimpanan lokal.

Modul ini menggunakan .NET 8.0 SDK. Pastikan Anda telah menginstal .NET 8.0 dengan menjalankan perintah berikut di terminal perintah pilihan Anda:

dotnet --list-sdks

Output yang mirip dengan contoh berikut muncul:

6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]

Pastikan bahwa versi yang dimulai dengan 8 terdaftar. Jika tidak ada yang tercantum atau perintah tidak ditemukan, instal .NET 8.0 SDK terbaru.

Membuka solusi permulaan

  1. Klon atau unduh exercise repo.

    Catatan

    Yang terbaik adalah mengkloning konten latihan ke jalur folder pendek, seperti C:\dev, untuk menghindari file yang dihasilkan build melebihi panjang jalur maksimum.

  2. Gunakan Visual Studio untuk membuka solusi Orang.sln, yang akan Anda temukan di mslearn-dotnetmaui-store-local-data> Orang, atau folder pemula di Visual Studio Code.

    Catatan

    Jangan mencoba dan membangun solusinya dulu. Kode tidak lengkap dan tidak akan dikompilasi sampai Anda menambahkan elemen yang hilang nanti dalam latihan ini.

Menentukan entitas SQLite

  1. Klik kanan proyek Orang, pilih Tambahkan, lalu pilih Folder baru untuk menambahkan folder baru ke proyek. Beri nama model folder baru.

  2. Klik kanan folder Model, pilih Tambahkan, dan pilih Kelas. Pastikan Kelas dipilih dalam daftar, lalu beri nama kelas baru Person.cs. Pilih Tambahkan.

  3. Ubah kelas dan tandai sebagai public:

    namespace People.Models;
    
    public class Person
    {
    }
    
  4. Tambahkan properti yang int dipanggil Id ke Person kelas .

  5. Tambahkan properti yang string disebut Name. Kelas akan terlihat seperti berikut:

    namespace People.Models;
    
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
  6. Simpan file Person.cs.

Menambahkan pustaka SQLite

  1. Klik kanan pada simpul proyek People dari Penjelajah Solusi di Visual Studio.

  2. Di menu konteks yang muncul, pilih Kelola Paket NuGet.

  3. Cari dan pilih sqlite-net-pcl, lalu pilih Instal.

    A screenshot showing the NuGet package manager with the sqlite-net-pcl library selected.

  4. Cari juga dan pilih SQLitePCLRaw.bundle_green, lalu pilih Instal.

Jika menggunakan Visual Studio Code, buka terminal dan paket ini dengan perintah berikut:

dotnet add package sqlite-net-pcl
dotnet add package SQLitePCLRaw.bundle_green

Menambahkan atribut SQLite

  1. Dalam file Person.cs, tambahkan using direktif untuk SQLite namespace ke file untuk Person kelas . Direktif ini memungkinkan Anda menggunakan atribut SQLite.

    using SQLite;
    
    namespace People.Models;
    
    public class Person
    {
        ...
    }
    
  2. Anotasi Person kelas dengan [Table] atribut , dan tentukan nama tabel sebagai people.

  3. Tentukan Id properti sebagai kunci utama. Buat anotasi dengan [PrimaryKey] atribut dan [AutoIncrement] .

  4. Tambahkan anotasi ke Name properti . MaxLength Tentukan sebagai 250. Tentukan bahwa setiap nilai dalam kolom harus Unique.

    Kelas yang sudah selesai akan terlihat seperti berikut:

    using SQLite;
    
    namespace People.Models;
    
    [Table("people")]
    public class Person
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
    
        [MaxLength(250), Unique]
        public string Name { get; set; }
    }
    
  5. Simpan file Person.cs.

Sambungkan ke database

  1. Buka file PersonRepository.cs.

  2. Periksa kelas.PersonRepository Kelas ini berisi kode kerangka yang tidak lengkap dengan penanda TODO tempat Anda akan menambahkan fungsionalitas untuk mengakses database.

  3. Tambahkan direktif using untuk SQLite namespace layanan dan People.Models ke file untuk PersonRepository.cs kelas .

  4. Tambahkan bidang privat SQLiteConnection bernama conn ke kelas , di atas Init fungsi .

  5. Init Dalam fungsi , periksa untuk melihat apakah conn tidak sama dengan null. Jika demikian, segera tampilkan.

    if (conn != null)
        return;
    

    Dengan cara ini, kode inisialisasi untuk database SQLite hanya berjalan sekali.

  6. Inisialisasi bidang conn untuk menyambungkan ke database menggunakan _dbPath variabel .

  7. conn.CreateTable Gunakan metode untuk membuat tabel untuk menyimpan Person data. Fungsi Init yang diselesaikan akan terlihat seperti berikut:

    using SQLite;
    using People.Models;
    ...
    
    private SQLiteConnection conn;
    ...
    private void Init()
    {
       if (conn != null)
          return;
    
       conn = new SQLiteConnection(_dbPath);
       conn.CreateTable<Person>();
    }
    

Menyisipkan baris ke dalam database

  1. Di PersonRepository kelas, temukan AddNewPerson metode .

  2. TODO Ganti komentar dalam metode ini dengan kode untuk menyisipkan objek baruPerson. Kode pertama kali memanggil Init untuk memverifikasi database diinisialisasi, lalu menggunakan SQLiteConnection metode objek Insert . Atur result variabel ke nilai yang Insert dikembalikan metode, seperti yang ditunjukkan dalam kode berikut:

    public void AddNewPerson(string name)
    {
        int result = 0;
        try
        {
            // enter this line
            Init();
    
            // basic validation to ensure a name was entered
            if (string.IsNullOrEmpty(name))
                throw new Exception("Valid name required");
    
            // enter this line
            result = conn.Insert(new Person { Name = name });
            ...
        }
        ...
    }
    

Mengambil baris dari database

  1. PersonRepository Di kelas , temukan metode .GetAllPeople

  2. Panggil Init untuk memverifikasi bahwa database telah diinisialisasi.

  3. Gunakan metode generik Table\<T> untuk mengambil semua baris dalam tabel. Tentukan Person sebagai parameter jenis.

  4. ToList() Gunakan metode ekstensi untuk mengubah hasilnya menjadi List\<Person> koleksi dan mengembalikan koleksi ini.

  5. Tambahkan penanganan kesalahan dengan mengemas kode Anda dalam blok try-catch. Jika ada kesalahan, atur StatusMessage properti ke properti pengecualian Message dan kembalikan koleksi kosong. Metode lengkapnya akan terlihat seperti ini:

    public List<Person> GetAllPeople()
    {
       try
       {
          Init();
          return conn.Table<Person>().ToList();
       }
       catch (Exception ex)
       {
          StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message);
       }
    
       return new List<Person>();
    }
    
  6. Simpan file PersonRepository.cs.

Mengintegrasikan repositori ke dalam UI

  1. Buka file MauiProgram.cs.

  2. CreateMauiApp Dalam fungsi , setelah pernyataan yang menambahkan MainPage halaman sebagai layanan singleton ke aplikasi, tambahkan kode untuk melakukan tugas berikut:

    • Buat variabel string bernama dbPath. Mulai inisialisasi string ini dengan ekspresi FileAccessHelper.GetLocalFilePath("people.db3"). File database yang digunakan aplikasi akan disebut people.db3, dan aplikasi akan menyimpan file ini di penyimpanan lokal pada perangkat.

    • Gunakan injeksi dependensi untuk menambahkan kelas PersonRepository sebagai layanan database tunggal ke aplikasi. Kelas PersonRepository mengekspos konstruktor yang mengambil jalur ke file database sebagai parameter string.

    Kode yang telah selesai untuk CreateMauiApp fungsi akan terlihat seperti ini:

    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });
    
        // Add this code
        string dbPath = FileAccessHelper.GetLocalFilePath("people.db3");
        builder.Services.AddSingleton<PersonRepository>(s => ActivatorUtilities.CreateInstance<PersonRepository>(s, dbPath));
    
        return builder.Build();
    }
    
  3. Simpan file MauiProgram.cs.

  4. Perluas App.xaml di Penjelajah Solusi, lalu buka file App.xaml.cs.

  5. Tambahkan properti , static yang publicdipanggil PersonRepo untuk menyimpan PersonRepository objek ke App kelas .

  6. Inisialisasi PersonRepo properti di konstruktor dengan menambahkan PersonRepository parameter ke konstruktor dan mengatur properti 'PersonRepo' ke nilai dalam parameter ini. Kelas yang telah selesai App akan terlihat seperti ini:

    public partial class App : Application
    {
        public static PersonRepository PersonRepo { get; private set; }
    
        public App(PersonRepository repo)
        {
            InitializeComponent();
    
            MainPage = new AppShell();
    
            PersonRepo = repo;
        }
    }
    

Catatan

Proses injeksi dependensi secara otomatis mengisi repo parameter ke konstruktor.

Uji aplikasi

  1. Buat solusi dengan menggunakan CTRL+Shift+B dan mulai penelusuran kesalahan dengan menggunakan F5. Saat UI muncul, masukkan nama Anda dan pilih Tambahkan Orang.

    A screenshot of the app with a successful message stating a record has been added.

  2. Pilih Dapatkan Semua Orang dan verifikasi bahwa nama Anda muncul.

    A screenshot of the app with a list of all the records in the database.

  3. Bereksperimenlah dengan menambahkan lebih banyak nama dan mengambil daftar orang yang disimpan.

  4. Kembali ke Visual Studio atau Visual Studio Code dan hentikan penelusuran kesalahan dengan menggunakan Shift+F5.

  5. Mulai ulang aplikasi dan pilih Dapatkan Semua Orang. Verifikasi bahwa nama yang Anda simpan sebelumnya masih tersimpan di database. Tutup aplikasi saat Anda selesai.