Alıştırma: SQLite ile verileri yerel olarak depolama

Tamamlandı

Bu alıştırmada, bilgileri bir uygulamayla yerel olarak depolamak için SQLite kullanacaksınız. Örnek senaryoda, yanıt hızını artırmak için sosyal medya uygulamasının verilerini önbelleğe alma kararı verdiniz. Bu alıştırmada, kişiler hakkındaki bilgileri depolamak için yerel bir SQLite veritabanı oluşturulur ve kullanılır. Fiziksel veritabanı dosyasını yerel depolama alanına kaydedeceksiniz.

Bu modülde .NET 8.0 SDK kullanılır. Tercih ettiğiniz komut terminalinde aşağıdaki komutu çalıştırarak .NET 8.0'ın yüklü olduğundan emin olun:

dotnet --list-sdks

Aşağıdaki örneğe benzer bir çıkış görüntülenir:

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

ile 8 başlayan bir sürümün listelendiğinden emin olun. Hiçbiri listelenmiyorsa veya komut bulunamazsa en son .NET 8.0 SDK'sını yükleyin.

Başlangıç çözümünü açın

  1. Alıştırma depoyu kopyalayın veya indirin.

    Dekont

    Derleme tarafından oluşturulan dosyaların yol uzunluğunun üst sınırını aşmasını önlemek için alıştırma içeriğini C:\dev gibi kısa bir klasör yoluna kopyalamak en iyisidir.

  2. mslearn-dotnetmaui-store-local-data Kişiler veya Visual Studio Code'daki starter klasöründe bulabileceğiniz Kişiler.sln çözümünü açmak için Visual Studio'yu kullanın.>

    Dekont

    Henüz çözümü oluşturmaya çalışmayın. Kod tamamlanmamıştır ve bu alıştırmanın devamında eksik öğeleri ekleyene kadar derlenmez.

SQLite varlığı tanımlama

  1. projeye yeni bir klasör eklemek için Kişiler projeye sağ tıklayın, Ekle'yi ve ardından Yeni klasör'e tıklayın. Yeni klasöre Models adını verin.

  2. Modeller klasörüne sağ tıklayın, Ekle'yi ve ardından Sınıf'ı seçin. Listede Sınıf'ın seçili olduğundan emin olun ve yeni sınıfı Person.cs olarak adlandırın. Ekle'yi seçin.

  3. sınıfını değiştirin ve olarak publicişaretleyin:

    namespace People.Models;
    
    public class Person
    {
    }
    
  4. sınıfına Person adlı Id bir int özellik ekleyin.

  5. adlı Namebir string özellik ekleyin. sınıfı şu şekilde görünmelidir:

    namespace People.Models;
    
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
  6. Person.cs dosyasını kaydedin.

SQLite kitaplığını ekleme

  1. Visual Studio'daki Çözüm Gezgini Kişiler proje düğümüne sağ tıklayın.

  2. Görüntülenen bağlam menüsünde NuGet Paketlerini Yönet'i seçin.

  3. sqlite-net-pcl araması yapın ve seçin, ardından Yükle'yi seçin.

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

  4. Ayrıca SQLitePCLRaw.bundle_green arayın ve seçin, ardından Yükle'yi seçin.

Visual Studio Code kullanıyorsanız terminali ve bu paketleri aşağıdaki komutlarla açın:

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

SQLite öznitelikleri ekleme

  1. Person.cs dosyasında, sınıfın SQLite dosyasına ad alanı için Person bir using yönerge ekleyin. Bu yönerge, SQLite özniteliklerini kullanmanıza olanak tanır.

    using SQLite;
    
    namespace People.Models;
    
    public class Person
    {
        ...
    }
    
  2. özniteliğiyle sınıfına Person[Table] ek açıklama ekleyin ve tablo adını olarak peoplebelirtin.

  3. Id Birincil anahtar olarak özelliğini belirtin. ve [AutoIncrement] öznitelikleriyle not [PrimaryKey] ekleyin.

  4. özelliğine Name ek açıklamalar ekleyin. MaxLength 250 olarak belirtin. sütunundaki her değerin olması Uniquegerektiğini belirtin.

    Tamamlanan sınıf şöyle görünmelidir:

    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. Person.cs dosyasını kaydedin.

Veritabanına bağlanın

  1. PersonRepository.cs dosyasını açın.

  2. sınıfını PersonRepository inceleyin. Bu sınıf, veritabanına erişmek için işlevselliği ekleyeceğiniz işaretçileri olan TODO tamamlanmamış iskelet kodu içerir.

  3. sınıfı için SQLite dosyasına ve People.Models ad alanları için PersonRepository.cs bir using yönerge ekleyin.

  4. işlevinin üstüne Init sınıfına adlı conn özel SQLiteConnection bir alan ekleyin.

  5. işlevindeInit, değerine eşit nullolup olmadığını conn denetleyin. Öyleyse, hemen geri dönün.

    if (conn != null)
        return;
    

    Bu şekilde, SQLite veritabanının başlatma kodu yalnızca bir kez çalıştırılır.

  6. değişkenini conn kullanarak _dbPath veritabanına bağlanmak için alanını başlatın.

  7. Veri depolamak conn.CreateTablePerson için bir tablo oluşturmak için yöntemini kullanın. Tamamlanan Init işlev aşağıdaki gibi görünmelidir:

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

Veritabanına satır ekleme

  1. sınıfında PersonRepository yöntemini bulun AddNewPerson .

  2. TODO Yeni bir Person nesne eklemek için bu yöntemdeki açıklamayı kodla değiştirin. Kod önce veritabanının başlatıldığını doğrulamak için çağırır Init , ardından nesnenin SQLiteConnectionInsert yöntemini kullanır. result Değişkeni, aşağıdaki kodda gösterildiği gibi yöntemin döndürdüğü değere Insert ayarlayın:

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

Veritabanından satır alma

  1. PersonRepository sınıfında yöntemini bulunGetAllPeople.

  2. Veritabanının başlatıldığını doğrulamak için çağrısı Init yapın.

  3. Tablodaki tüm satırları almak için genel Table\<T> yöntemini kullanın. tür parametresi olarak belirtin Person .

  4. ToList() Uzantı yöntemini kullanarak sonucu bir List\<Person> koleksiyona dönüştürün ve bu koleksiyonu döndürün.

  5. Kodunuzu bir try-catch bloğun içine kaydırarak hata işleme ekleyin. Hata varsa özelliğini özel durumun Message özelliğine ayarlayın StatusMessage ve boş bir koleksiyon döndürin. Tamamlanmış yöntem aşağıdaki gibi görünmelidir:

    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. PersonRepository.cs dosyasını kaydedin.

Depoyu kullanıcı arabirimiyle tümleştirme

  1. MauiProgram.cs dosyasını açın.

  2. işlevinde CreateMauiApp , sayfayı MainPage uygulamaya tekil hizmet olarak ekleyen deyimlerden sonra aşağıdaki görevleri gerçekleştirmek için kod ekleyin:

    • adlı dbPathbir dize değişkeni oluşturun. Bu dizeyi ifadesiyle FileAccessHelper.GetLocalFilePath("people.db3")başlatın. Uygulamanın kullandığı veritabanı dosyası people.db3 olarak adlandırılır ve uygulama bu dosyayı cihazdaki yerel depolama alanına kaydeder.

    • Sınıfı uygulamaya tekil hizmet olarak eklemek PersonRepository için bağımlılık ekleme özelliğini kullanın. sınıfı, PersonRepository veritabanı dosyasının yolunu dize parametresi olarak alan bir oluşturucuyu kullanıma sunar.

    İşlevin CreateMauiApp tamamlanmış kodu şu şekilde görünmelidir:

    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. MauiProgram.cs dosyasını kaydedin.

  4. Çözüm Gezgini App.xaml'i genişletin, ardından App.xaml.cs dosyasını açın.

  5. sınıfına bir publicnesne App tutmak için adlı PersonRepo bir PersonRepository , static özelliği ekleyin.

  6. Oluşturucuya PersonRepo bir PersonRepository parametre ekleyerek ve 'PersonRepo' özelliğini bu parametredeki değere ayarlayarak oluşturucuda özelliğini başlatın. Tamamlanan App sınıf şöyle görünmelidir:

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

Dekont

Bağımlılık ekleme işlemi, parametresini repo oluşturucuya otomatik olarak doldurur.

Uygulamayı test etme

  1. CTRL+Shift+B tuşlarını kullanarak çözümü derleyin ve F5 kullanarak hata ayıklamaya başlayın. Kullanıcı arabirimi göründüğünde adınızı girin ve Kişi Ekle'yi seçin.

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

  2. Tüm Kişiler Al'ı seçin ve adınızın görüntülendiğini doğrulayın.

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

  3. Daha fazla ad ekleyerek ve depolanan kişilerin listesini alarak denemeler yapın.

  4. Visual Studio veya Visual Studio Code'a dönün ve Shift+F5 tuşlarını kullanarak hata ayıklamayı durdurun.

  5. Uygulamayı yeniden başlatın ve Tüm Kişiler Al'ı seçin. Daha önce depoladığınız adların hala veritabanında depolandığını doğrulayın. İşiniz bittiğinde uygulamayı kapatın.