SQLite ile verileri yerel olarak depolama

Tamamlandı

SQLite, ilişkisel verileriniz olduğunda kullanışlıdır. Bir sosyal medya uygulaması oluşturduğunuzu varsayalım. Uygulamaya abone olanlarla ilgili bilgileri depolamanız gerekir. Bu veriler, her kullanıcı ve adı için benzersiz bir kimlik içerir. SQLite veritabanında bu tür bir ilişkiyi kolayca modelleyebilirsiniz.

Bu ünitede, SQLite-net kullanarak bir .NET MAUI uygulamasında SQLite kullanmayı öğreneceksiniz.

SQLite nedir?

SQLite, mobil uygulamalar için endüstri standardı haline gelen basit bir platformlar arası yerel veritabanıdır. SQLite için sunucu gerekmez. Veritabanı, cihazın dosya sistemindeki tek bir disk dosyasında depolanır. Tüm okuma ve yazma işlemleri doğrudan SQLite disk dosyasında çalıştırılır.

SQLite yerel kitaplıkları varsayılan olarak Android ve iOS'ta yerleşiktir; ancak altyapı yalnızca C/C++ API'sini destekler. Bu senaryo, SQLite ve .NET'in etkileşim kurması için bir yol arayan .NET geliştiricileri için ideal değildir.

SQLite-net nedir?

.NET geliştiricilerinin kullanabileceği yerel SQLite altyapısı çevresinde birkaç C# sarmalayıcı vardır. Birçok .NET geliştiricisi SQLite-net adlı popüler bir C# sarmalayıcı kullanır.

SQLite-net, nesne-ilişkisel eşleyicidir. Şema olarak hizmet vermek için projelerinizde tanımlanan modelleri kullanmanıza izin vererek veritabanı şemalarını tanımlama işlemini basitleştirmeye yardımcı olur.

Diagram showing how SQLite-net provides a .NET wrapper and the SQLite C/C++ engine.

Örneğin, bir Usermodelleyen aşağıdaki sınıfı göz önünde bulundurun:

class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    ...
}

Nesne ilişkisel eşleyici kullanarak bu ilk User sınıfı alabilir ve bu sınıftaki ve Username alanları için Id sütunları olan adlı User bir veritabanı tablosu oluşturabilirsiniz.

SQLite-net bir NuGet paketi olarak gönderilir. Kullanmak için uygulamalarınıza sqlite-net-pcl paketini eklemeniz gerekir. Visual Studio'da NuGet paket yöneticisini kullanın. Ayrıca, Bir uygulamayı Android'de çalıştırmak istiyorsanız, SQLitePCLRaw.provider.dynamic_cdecl paketini de eklemeniz gerekir.

SQLite veritabanına bağlanma

Bir nesne aracılığıyla SQLiteConnection bir uygulamadan SQLite veritabanına bağlantı kurabilirsiniz. Bu sınıf, SQLite'in SQLite sağladığı diğer tür ve yöntemlerle birlikte ad alanında tanımlanır. Bu nesnenin örneğini oluştururken, veritabanı dosyasının dosya adını geçirirsiniz. Oluşturucu, varsa dosyayı açar veya yoksa oluşturur.

Aşağıdaki kodda bir örnek gösterilir:

using SQLite;
...
string filename = ...
SQLiteConnection conn = new SQLiteConnection(filename);

Bunun uygulama korumalı alanında bir konuma işaret etmesi filename gerektiğini unutmayın.

Tablo oluşturma

SQLite-net'in nesne-ilişkisel eşleyici olduğunu hatırlayın. Bu, veritabanı şemanızı C# sınıflarından oluşturabileceğiniz anlamına gelir. SQLite-net sıradan bir C# sınıfından veritabanı tablosu oluşturabilir, ancak ek meta veriler sağlamak için bir sınıfa ekleyebileceğiniz birçok öznitelik vardır. Bu meta veriler SQLite'in benzersizlik gibi özellikleri zorunlu kılmasına ve verilerinize kısıtlamalar uygulamasına yardımcı olur.

Kullanılabilir öznitelikler şunlardır:

  • Table: Sınıfın adından farklı bir şey olmasını istiyorsanız tablonun adını belirtin
  • PrimaryKey: Sütunun birincil anahtar olduğunu belirtin
  • AutoIncrement: Yeni bir satır eklendiğinde sütunun otomatik olarak değer olarak artması gerektiğini belirtin
  • Column: Özellik adından farklı bir şey olmasını istiyorsanız sütunun adını belirtin
  • MaxLength: Sütunda kullanılabilecek en fazla karakter sayısını belirtin
  • Unique: Sütundaki değerin diğer tüm satırlardan benzersiz olması gerektiğini belirtin

Aşağıdaki kod, sınıfın User bu öznitelikleri uygulayan güncelleştirilmiş bir sürümünü gösterir:

[Table("user")]
public class User
{
    // PrimaryKey is typically numeric 
    [PrimaryKey, AutoIncrement, Column("_id")]
    public int Id { get; set; }

    [MaxLength(250), Unique]
    public string Username { get; set; }
    ...
}

C# sınıfınızı tanımladıktan sonra veritabanında tablo oluşturmak için sınıfında genel yöntemini SQLiteConnection çağırınCreateTable. tür parametresi olarak sınıfını belirtin. Bir örnek aşağıda verilmiştir:

SQLiteConnection conn = new SQLiteConnection(filename);
conn.CreateTable<User>();

Tablo veritabanında zaten varsa, CreateTable yöntem herhangi bir değişiklik olup olmadığını görmek için şemayı denetler. Varsa, işlem veritabanı şemasını güncelleştirmeye çalışır.

Temel okuma ve yazma işlemlerini yapma

Tablo oluşturduktan sonra, tabloyla etkileşim kurmaya başlayabilirsiniz. Satır eklemek için örnekte yöntemini InsertSQLiteConnection kullanın ve eklenecek verileri tutan uygun türde bir nesne sağlayın. Aşağıdaki kod tabloya nasıl yeni satır User ekleneceğini gösterir:

public int AddNewUser(User user)
{
    int result = conn.Insert(user);
    return result;
}

yöntemi, Insert tabloya eklenen satır sayısını temsil eden bir intdöndürür. Bu durumda, bu sayı birdir.

Tablodan satır almak için yöntemini kullanın Table . Bu yöntem bir nesne koleksiyonu döndürür (boş olabilir):

public List<User> GetAllUsers()
{
    List<User> users = conn.Table<User>().ToList();
    return users;
}

Table metodu bir TableQuery\<T> nesnesi döndürür. almak Listiçin yukarıdaki örnekte gösterildiği gibi yöntemini kullanın ToList .

LINQ kullanarak SQLite sorgusu yürütme

Table yöntemi bir tablodan tüm satırları alır. Çoğu durumda, belirtilen ölçüt kümesiyle eşleşen satırların yalnızca bir alt kümesini döndürmek istersiniz. Bu görevler için SQLite-net ile LINQ kullanın.

SQLite-net aşağıdakiler dahil olmak üzere birçok yaygın LINQ sorgularını destekler:

  • Konumu
  • Take
  • Atla
  • OrderBy
  • Orderbydescending
  • Thenby
  • ElementAt
  • First
  • Firstordefault
  • Thenbydescending
  • Sayı

Bu yöntemlerle, uzantı yöntemi söz dizimini veya LINQ C# söz dizimini kullanabilirsiniz. Örneğin, aşağıda belirtilen kullanıcının ayrıntılarını almanıza olanak tanıyan bir kod parçacığı verilmiştir:

public User GetByUsername(string username)
{
    var user = from u in conn.Table<User>()
               where u.Username == username
               select u;
    return user.FirstOrDefault();
}

Satırları güncelleştirme ve silme

Nesnenin SQLiteConnectionUpdate yöntemini kullanarak bir satırı güncelleştirirsiniz. Yeni değerleriyle güncelleştirilecek satırı tanımlayan bir nesne sağlarsınız. yöntemi, Update sağlanan nesneyle aynı birincil anahtar değerine sahip olan satırı değiştirir. Döndürülen değer, değiştirilen satır sayısıdır. Bu değer sıfırsa eşleşen birincil anahtara sahip satır bulunamadı ve hiçbir şey güncelleştirilmedi. Sonraki kod parçacığı şu yöntemin çalıştığını gösterir:

public int UpdateUser(User user)
{
    int result = 0;
    result = conn.Update(user);
    return result;
}

Nesnenin Delete yöntemiyle bir tablodan SQLiteConnection satırları kaldırın. Bu yöntemin en basit biçimi, aşağıdaki örnekte gösterildiği gibi parametre olarak silinecek öğenin birincil anahtarını alır. Yöntemin Delete bu biçimi geneldir ve bir tür parametresi gerektirir. Döndürülen değer, tablodan kaldırılan satır sayısıdır:

public int DeleteUser(int userID)
{
    int result = 0;
    result = conn.Delete<User>(userID);
    return result;
}