Aracılığıyla paylaş


.NET MAUI yerel veritabanları

Örneğe göz atın. Örneğe göz atın

SQLite veritabanı altyapısı, .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) uygulamalarının paylaşılan koddaki veri nesnelerini yüklemesine ve kaydetmesine olanak tanır. Aşağıdaki adımları izleyerek bilgileri yerel veritabanında depolamak ve almak için SQLite.NET .NET MAUI uygulamalarıyla tümleştirebilirsiniz:

  1. NuGet paketini yükleyin.
  2. Sabitleri yapılandırın.
  3. Veritabanı erişim sınıfı oluşturun.
  4. Verilere erişin.
  5. Gelişmiş yapılandırma.

Bu makalede, yapılacaklar öğelerini depolamak üzere bir tabloya SQLite veritabanı erişimi sağlamak için sqlite-net-pcl NuGet paketi kullanılır. Alternatif olarak SQLite için basit bir ADO.NET sağlayıcısı olan Microsoft.Data.Sqlite NuGet paketini kullanabilirsiniz. Microsoft.Data.Sqlite; bağlantılar, komutlar ve veri okuyucular gibi işlevler için yaygın ADO.NET soyutlamaları uygular.

SQLite NuGet paketini yükleme

NuGet paket yöneticisini kullanarak sqlite-net-pcl paketini arayın ve .NET MAUI uygulama projenize en son sürümü ekleyin.

Benzer ada sahip birden fazla NuGet paketi olabilir. Doğru paketi şu özelliklerle ayırt edebilirsiniz:

  • Kimlik: sqlite-net-pcl
  • Yazarlar: SQLite-net
  • Sahipler: praeclarum
  • NuGet bağlantısı: sqlite-net-pcl

Paket adına rağmen.NET MAUI projelerinde sqlite-net-pcl NuGet paketini kullanın.

Önemli

SQLite.NET, praeclarum/sqlite-net deposunda desteklenen bir üçüncü taraf kitaplığıdır.

yükleme SQLitePCLRaw.bundle_green

sqlite-net-pcl'e ek olarak, her platformda SQLite'i kullanıma sunan temel bağımlılığı geçici olarak yüklemeniz gerekir:

  • Kimlik: SQLitePCLRaw.bundle_green
  • Sürüm:>= 2.1.0
  • Yazarlar: Eric Sink
  • Sahipler: Eric Sink
  • NuGet bağlantısı: SQLitePCLRaw.bundle_green

Uygulama sabitlerini yapılandırma

Veritabanı dosya adı ve yol gibi yapılandırma verileri uygulamanızda sabit olarak depolanabilir. Örnek proje, ortak yapılandırma verileri sağlayan bir Constants.cs dosyası içerir:

public static class Constants
{
    public const string DatabaseFilename = "TodoSQLite.db3";

    public const SQLite.SQLiteOpenFlags Flags =
        // open the database in read/write mode
        SQLite.SQLiteOpenFlags.ReadWrite |
        // create the database if it doesn't exist
        SQLite.SQLiteOpenFlags.Create |
        // enable multi-threaded database access
        SQLite.SQLiteOpenFlags.SharedCache;

    public static string DatabasePath =>
        Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename);
}

Bu örnekte sabitler dosyası, veritabanı bağlantısını başlatmak için kullanılan varsayılan SQLiteOpenFlag sabit listesi değerlerini belirtir. sabit SQLiteOpenFlag listesi şu değerleri destekler:

  • Create: Bağlantı, yoksa veritabanı dosyasını otomatik olarak oluşturur.
  • FullMutex: Bağlantı serileştirilmiş iş parçacığı modunda açılır.
  • NoMutex: Bağlantı çok iş parçacıklı modda açılır.
  • PrivateCache: Bağlantı, etkin olsa bile paylaşılan önbelleğe katılmaz.
  • ReadWrite: Bağlantı verileri okuyabilir ve yazabilir.
  • SharedCache: Bağlantı, etkinse paylaşılan önbelleğe katılır.
  • ProtectionComplete: Cihaz kilitliyken dosya şifrelenir ve erişilemez.
  • ProtectionCompleteUnlessOpen: Dosya açılana kadar şifrelenir, ancak kullanıcı cihazı kilitlese bile erişilebilir.
  • ProtectionCompleteUntilFirstUserAuthentication: Kullanıcı önyüklenip cihazın kilidini açana kadar dosya şifrelenir.
  • ProtectionNone: Veritabanı dosyası şifrelenmez.

Veritabanınızın nasıl kullanılacağına bağlı olarak farklı bayraklar belirtmeniz gerekebilir. hakkında SQLiteOpenFlagsdaha fazla bilgi için bkz . sqlite.org'da Yeni Veritabanı Bağlantısı Açma.

Veritabanı erişim sınıfı oluşturma

Veritabanı sarmalayıcı sınıfı, veri erişim katmanını uygulamanın geri kalanından soyutlar. Bu sınıf sorgu mantığını merkezileştirir ve veritabanı başlatma yönetimini basitleştirerek uygulama büyüdükçe veri işlemlerini yeniden düzenlemeyi veya genişletmeyi kolaylaştırır. Örnek uygulama bu amaçla bir TodoItemDatabase sınıf tanımlar.

Yavaş başlatma

, sınıfındaki TodoItemDatabase her yöntem tarafından çağrılan basit Init bir yöntemle veritabanının başlatılmasını ilk erişilene kadar geciktirmek için zaman uyumsuz gecikmeli başlatmayı kullanır:

public class TodoItemDatabase
{
    SQLiteAsyncConnection Database;

    public TodoItemDatabase()
    {
    }

    async Task Init()
    {
        if (Database is not null)
            return;

        Database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
        var result = await Database.CreateTableAsync<TodoItem>();
    }
    ...
}

Veri işleme yöntemleri

sınıfı dört TodoItemDatabase veri işleme türü için yöntemler içerir: oluşturma, okuma, düzenleme ve silme. SQLite.NET kitaplığı, SQL deyimleri yazmadan nesneleri depolamanıza ve almanıza olanak tanıyan basit bir Nesne İlişkisel Eşlemesi (ORM) sağlar.

Aşağıdaki örnekte örnek uygulamadaki veri işleme yöntemleri gösterilmektedir:

public class TodoItemDatabase
{
    ...
    public async Task<List<TodoItem>> GetItemsAsync()
    {
        await Init();
        return await Database.Table<TodoItem>().ToListAsync();
    }

    public async Task<List<TodoItem>> GetItemsNotDoneAsync()
    {
        await Init();
        return await Database.Table<TodoItem>().Where(t => t.Done).ToListAsync();

        // SQL queries are also possible
        //return await Database.QueryAsync<TodoItem>("SELECT * FROM [TodoItem] WHERE [Done] = 0");
    }

    public async Task<TodoItem> GetItemAsync(int id)
    {
        await Init();
        return await Database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
    }

    public async Task<int> SaveItemAsync(TodoItem item)
    {
        await Init();
        if (item.ID != 0)
            return await Database.UpdateAsync(item);
        else
            return await Database.InsertAsync(item);
    }

    public async Task<int> DeleteItemAsync(TodoItem item)
    {
        await Init();
        return await Database.DeleteAsync(item);
    }
}

Verilere erişme

Sınıf TodoItemDatabase , bağımlılık ekleme kullanıyorsanız uygulama genelinde kullanılabilecek tekil olarak kaydedilebilir. Örneğin, ve yöntemleriyle AddTransient AddSingleton sayfalarınızı ve veritabanı erişim sınıfınızı MauiProgram.cs nesnesinde hizmetler IServiceCollection olarak kaydedebilirsiniz:

builder.Services.AddSingleton<TodoListPage>();
builder.Services.AddTransient<TodoItemPage>();

builder.Services.AddSingleton<TodoItemDatabase>();

Bu hizmetler daha sonra sınıf oluşturucularına otomatik olarak eklenebilir ve şu hizmetlere erişilebilir:

TodoItemDatabase database;

public TodoItemPage(TodoItemDatabase todoItemDatabase)
{
    InitializeComponent();
    database = todoItemDatabase;
}

async void OnSaveClicked(object sender, EventArgs e)
{
    if (string.IsNullOrWhiteSpace(Item.Name))
    {
        await DisplayAlert("Name Required", "Please enter a name for the todo item.", "OK");
        return;
    }

    await database.SaveItemAsync(Item);
    await Shell.Current.GoToAsync("..");
}

Alternatif olarak, veritabanı erişim sınıfının yeni örnekleri oluşturulabilir:

TodoItemDatabase database;

public TodoItemPage()
{
    InitializeComponent();
    database = new TodoItemDatabase();
}

.NET MAUI uygulamalarında bağımlılık ekleme hakkında daha fazla bilgi için bkz . Bağımlılık ekleme.

Gelişmiş yapılandırma

SQLite, bu makalede ve örnek uygulamada ele alınandan daha fazla özelliğe sahip sağlam bir API sağlar. Aşağıdaki bölümlerde ölçeklenebilirlik açısından önemli olan özellikler ele alınıyor.

Daha fazla bilgi için bkz . sqlite.org hakkında SQLite Belgeleri .

Önceden yazma günlüğü

Varsayılan olarak, SQLite geleneksel bir geri alma günlüğü kullanır. Değiştirilmemiş veritabanı içeriğinin bir kopyası ayrı bir geri alma dosyasına yazılır, ardından değişiklikler doğrudan veritabanı dosyasına yazılır. İŞLEME, geri alma günlüğü silindiğinde gerçekleşir.

Önceden Yazma Günlüğü (WAL), değişiklikleri önce ayrı bir WAL dosyasına yazar. WAL modunda COMMIT, WAL dosyasına eklenen ve tek bir WAL dosyasında birden çok işlemin gerçekleşmesini sağlayan özel bir kayıttır. WAL dosyası, denetim noktası olarak adlandırılan özel bir işlemde veritabanı dosyasıyla yeniden birleştirilir.

Okuyucular ve yazarlar birbirini engellemediğinden ve okuma ve yazma işlemlerinin eşzamanlı olmasını sağladığından WAL yerel veritabanları için daha hızlı olabilir. Ancak WAL modu sayfa boyutunda değişikliklere izin vermez, veritabanına ek dosya ilişkilendirmeleri ekler ve ek denetim noktası oluşturma işlemini ekler.

SQLite.NET'da WAL'yi etkinleştirmek için örnekte yöntemini çağırın EnableWriteAheadLoggingAsync SQLiteAsyncConnection :

await Database.EnableWriteAheadLoggingAsync();

Daha fazla bilgi için bkz . sqlite.org'da SQLite Önceden Yazma Günlüğünü Kaydetme .

Veritabanı kopyalama

SQLite veritabanını kopyalamanın gerekebileceği birkaç durum vardır:

  • Veritabanı uygulamanızla birlikte gönderildi, ancak mobil cihazda kopyalanması veya yazılabilir depolama alanına taşınması gerekir.
  • Veritabanının yedeğini veya kopyasını oluşturmanız gerekir.
  • Veritabanı dosyasını sürüm, taşıma veya yeniden adlandırmanız gerekir.

Genel olarak, veritabanı dosyasını taşımak, yeniden adlandırmak veya kopyalamak, diğer dosya türleriyle aynı işlemdir ve dikkate alınması gereken birkaç nokta vardır:

  • Veritabanı dosyasını taşımaya çalışmadan önce tüm veritabanı bağlantıları kapatılmalıdır.
  • Önceden Yazma Günlüğü kullanıyorsanız, SQLite bir Paylaşılan Bellek Erişimi (.shm) dosyası ve bir (Önceden Yazma Günlüğü) (.wal) dosyası oluşturur. Bu dosyalara da tüm değişiklikleri uyguladığınıza emin olun.