Android ile SQLite.NET kullanma

Xamarin'in önerdiği SQLite.NET kitaplığı, bir Android cihazındaki yerel SQLite veritabanında nesneleri kolayca depolamanıza ve almanıza olanak tanıyan çok temel bir ORM'dir. ORM, SQL deyimleri yazmadan bir veritabanından "nesneleri" kaydetmenizi ve almanızı sağlayan bir API olan Nesne İlişkisel Eşleme anlamına gelir.

SQLite.NET kitaplığını bir Xamarin uygulamasına eklemek için projenize aşağıdaki NuGet paketini ekleyin:

NuGet paketini SQLite.NET

Kullanılabilir birçok farklı SQLite paketi vardır. Doğru SQLite paketini seçtiğinizden emin olun (aramada en önemli sonuç olmayabilir).

Önemli

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

SQLite.NET kitaplığını kullanılabilir duruma getirin, veritabanına erişmek için bu kitaplığı kullanmak için şu üç adımı izleyin:

  1. Using deyimi ekleme – Veri erişiminin gerekli olduğu C# dosyalarına aşağıdaki deyimi ekleyin:

    using SQLite;
    
  2. Boş Veritabanı Oluşturma – SQLiteConnection sınıf oluşturucusunun dosya yolu geçirilerek veritabanı başvurusu oluşturulabilir. Dosyanın zaten var olup olmadığını denetlemeniz gerekmez; gerekirse otomatik olarak oluşturulur, aksi takdirde mevcut veritabanı dosyası açılır. Değişken, dbPath bu belgenin önceki bölümlerinde açıklanan kurallara göre belirlenmelidir:

    var db = new SQLiteConnection (dbPath);
    
  3. Verileri Kaydet – Bir SQLiteConnection nesnesi oluşturduktan sonra, veritabanı komutları CreateTable ve Insert gibi yöntemleri çağrılarak yürütülür:

    db.CreateTable<Stock> ();
    db.Insert (newStock); // after creating the newStock object
    
  4. Veri Al – Bir nesneyi (veya nesne listesini) almak için aşağıdaki söz dizimini kullanın:

    var stock = db.Get<Stock>(5); // primary key id of 5
    var stockList = db.Table<Stock>();
    

Temel Veri Erişimi Örneği

Bu belgenin DataAccess_Basic örnek kodu, Android'de çalışırken aşağıdaki gibi görünür. Kod, basit SQLite.NET işlemlerinin nasıl gerçekleştiriltiğini gösterir ve sonuçları uygulamanın ana penceresinde metin olarak gösterir.

Android

Android SQLite.NET örneği

Aşağıdaki kod örneği, temel alınan veritabanı erişimini kapsüllemek için SQLite.NET kitaplığını kullanan tüm veritabanı etkileşimini gösterir. Şunları gösterir:

  1. Veritabanı dosyası oluşturma

  2. Nesneleri oluşturup kaydederek veri ekleme

  3. Veriyi sorgulama

Şu ad alanlarını eklemeniz gerekir:

using SQLite; // from the github SQLite.cs class

Sonuncusu için projenize SQLite eklemiş olmanız gerekir. SQLite veritabanı tablosunun CREATE TABLE komutu yerine sınıfa ( Stock sınıf) öznitelikler eklenerek tanımlandığını unutmayın.

[Table("Items")]
public class Stock {
    [PrimaryKey, AutoIncrement, Column("_id")]
    public int Id { get; set; }
    [MaxLength(8)]
    public string Symbol { get; set; }
}
public static void DoSomeDataAccess () {
       Console.WriteLine ("Creating database, if it doesn't already exist");
   string dbPath = Path.Combine (
        Environment.GetFolderPath (Environment.SpecialFolder.Personal),
        "ormdemo.db3");
   var db = new SQLiteConnection (dbPath);
   db.CreateTable<Stock> ();
   if (db.Table<Stock> ().Count() == 0) {
        // only insert the data if it doesn't already exist
        var newStock = new Stock ();
        newStock.Symbol = "AAPL";
        db.Insert (newStock);
        newStock = new Stock ();
        newStock.Symbol = "GOOG";
        db.Insert (newStock);
        newStock = new Stock ();
        newStock.Symbol = "MSFT";
        db.Insert (newStock);
    }
    Console.WriteLine("Reading data");
    var table = db.Table<Stock> ();
    foreach (var s in table) {
        Console.WriteLine (s.Id + " " + s.Symbol);
    }
}

Özniteliğinin [Table] tablo adı parametresi belirtmeden kullanılması, temel alınan veritabanı tablosunun sınıfla aynı ada (bu örnekte "Hisse Senedi") sahip olmasına neden olur. ORM veri erişim yöntemlerini kullanmak yerine doğrudan veritabanına SQL sorguları yazarsanız gerçek tablo adı önemlidir. Benzer şekilde [Column("_id")] özniteliği isteğe bağlıdır ve yoksa tabloya sınıfındaki özelliğiyle aynı ada sahip bir sütun eklenir.

SQLite Öznitelikleri

Temel alınan veritabanında nasıl depolandıklarını denetlemek için sınıflarınıza uygulayabileceğiniz yaygın öznitelikler şunlardır:

  • [PrimaryKey] – Bu öznitelik, temel alınan tablonun birincil anahtarı olmaya zorlamak için bir integer özelliğine uygulanabilir. Bileşik birincil anahtarlar desteklenmez.

  • [AutoIncrement] – Bu öznitelik, veritabanına eklenen her yeni nesne için bir tamsayı özelliğinin değerinin otomatik olarak artırmasına neden olur

  • [Sütun(ad)] – parametresi, name temel alınan veritabanı sütununun adını ayarlar.

  • [Tablo(ad)] – Sınıfı, belirtilen adla temel alınan bir SQLite tablosunda depolanabilecek şekilde işaretler.

  • [MaxLength(değer)] – Veritabanı ekleme denendiğinde metin özelliğinin uzunluğunu kısıtlayın. Bu öznitelik yalnızca bir veritabanı ekleme veya güncelleştirme işlemi denendiğinde 'işaretlenir' olduğundan, kod tüketilirken nesne eklenmadan önce bu doğrulanmalıdır.

  • [Yoksay] – SQLite.NET bu özelliği yoksaymalarına neden olur. Bu özellikle veritabanında depolanamayan bir türe sahip özellikler veya SQLite tarafından otomatik olarak çözümlenemeyen koleksiyonları modelleyen özellikler için kullanışlıdır.

  • [Benzersiz] – Temel alınan veritabanı sütunundaki değerlerin benzersiz olmasını sağlar.

Bu özniteliklerin çoğu isteğe bağlıdır. Seçim ve silme sorgularının verileriniz üzerinde verimli bir şekilde gerçekleştirilebilmesi için her zaman bir tamsayı birincil anahtarı belirtmeniz gerekir.

Daha Karmaşık Sorgular

üzerinde aşağıdaki yöntemler SQLiteConnection diğer veri işlemlerini gerçekleştirmek için kullanılabilir:

  • Insert : Veritabanına yeni bir nesne ekler.

  • Get<T> : Birincil anahtarı kullanarak bir nesneyi almaya çalışır.

  • Tablo T> : Tablodaki<tüm nesneleri döndürür.

  • Delete : Birincil anahtarını kullanarak bir nesneyi siler.

  • Sorgu<T> – Bir dizi satır (nesne olarak) döndüren bir SQL sorgusu gerçekleştirin.

  • Execute – SQL'den satır beklemediğinizde (INSERT, UPDATE ve DELETE yönergeleri gibi) bu yöntemi ( Querydeğil) kullanın.

Birincil anahtara göre nesne alma

SQLite.Net, birincil anahtarına göre tek bir nesneyi almak için Get yöntemini sağlar.

var existingItem = db.Get<Stock>(3);

Linq kullanarak nesne seçme

Bir tablonun içeriğini sorgulamak veya sıralamak için Linq kullanabilmeniz için koleksiyonları döndüren yöntemler desteklenir IEnumerable<T> . Aşağıdaki kodda, "A" harfiyle başlayan tüm girişleri filtrelemek için Linq kullanan bir örnek gösterilmektedir:

var apple = from s in db.Table<Stock>()
    where s.Symbol.StartsWith ("A")
    select s;
Console.WriteLine ("-> " + apple.FirstOrDefault ().Symbol);

SQL kullanarak nesne seçme

SQLite.Net verilerinize nesne tabanlı erişim sağlayabilse de, bazen Linq'in izin verdiğinden daha karmaşık bir sorgu yapmanız gerekebilir (veya daha hızlı performansa ihtiyacınız olabilir). Burada gösterildiği gibi Sorgu yöntemiyle SQL komutlarını kullanabilirsiniz:

var stocksStartingWithA = db.Query<Stock>("SELECT * FROM Items WHERE Symbol = ?", "A");
foreach (var s in stocksStartingWithA) {
    Console.WriteLine ("a " + s.Symbol);
}

Not

SQL deyimlerini doğrudan yazarken, veritabanınızdaki sınıflarınızdan ve özniteliklerinden oluşturulan tablo ve sütunların adlarına bağımlılık oluşturursunuz. Kodunuzda bu adları değiştirirseniz el ile yazılmış SQL deyimlerini güncelleştirmeyi unutmamanız gerekir.

Nesne silme

Birincil anahtar, burada gösterildiği gibi satırı silmek için kullanılır:

var rowcount = db.Delete<Stock>(someStock.Id); // Id is the primary key

Etkilenen satır sayısını onaylamak için (bu durumda silindi) seçeneğini de kontrol rowcount edebilirsiniz.

Birden Çok İş Parçacığıyla SQLite.NET Kullanma

SQLite üç farklı iş parçacığı modunu destekler: Tek iş parçacığı, Çok iş parçacığı ve Serileştirilmiş. Veritabanına herhangi bir kısıtlama olmadan birden çok iş parçacığından erişmek istiyorsanız, SQLite'i Serileştirilmiş iş parçacığı modunu kullanacak şekilde yapılandırabilirsiniz. Bu modu uygulamanızda erken ayarlamak önemlidir (örneğin, yöntemin OnCreate başında).

İş parçacığı modunu değiştirmek için öğesini çağırın SqliteConnection.SetConfig. Örneğin, bu kod satırı Serileştirilmiş mod için SQLite'i yapılandırıyor :

using using Mono.Data.Sqlite;
...
SqliteConnection.SetConfig(SQLiteConfig.Serialized);

SQLite'in Android sürümünde birkaç adım daha gerektiren bir sınırlama vardır. çağrısı SqliteConnection.SetConfig gibi library used incorrectlybir SQLite özel durumu oluşturursa aşağıdaki geçici çözümü kullanmanız gerekir:

  1. ve sqlite3_initialize API'lerinin uygulamada kullanılabilir hale getirebilmesi için yerel libsqlite.so kitaplığına sqlite3_shutdown bağlanın:

    [DllImport("libsqlite.so")]
    internal static extern int sqlite3_shutdown();
    
    [DllImport("libsqlite.so")]
    internal static extern int sqlite3_initialize();
    
  2. Yönteminin OnCreate en başında, SQLite'i kapatmak, Seri hale getirilmiş mod için yapılandırmak ve SQLite'i yeniden başlatmak için bu kodu ekleyin:

    using using Mono.Data.Sqlite;
    ...
    sqlite3_shutdown();
    SqliteConnection.SetConfig(SQLiteConfig.Serialized);
    sqlite3_initialize();
    

Bu geçici çözüm kitaplık için Mono.Data.Sqlite de çalışır. SQLite ve çoklu iş parçacığı oluşturma hakkında daha fazla bilgi için bkz . SQLite ve Birden Çok İş Parçacığı.