Xamarin.iOS ile SQLite.NET kullanma
Xamarin'in önerdiği SQLite.NET kitaplığı, yerel SQLite veritabanındaki nesneleri bir iOS cihazında depolamanıza ve almanıza olanak tanıyan 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.
Kullanım
SQLite.NET kitaplığını bir Xamarin uygulamasına eklemek için projenize aşağıdaki NuGet paketini ekleyin:
- Paket Adı: sqlite-net-pcl
- Yazar: Frank A. Krueger
- Kimlik: sqlite-net-pcl
- Url: nuget.org/packages/sqlite-net-pcl
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:
Using deyimi ekleme - Veri erişiminin gerekli olduğu C# dosyalarına aşağıdaki deyimi ekleyin:
using SQLite;
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.
var db = new SQLiteConnection (dbPath);
dbPath değişkeni, bu belgenin önceki bölümlerinde açıklanan kurallara göre belirlenmelidir.
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
Veri Alma - 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 iOS üzerinde çalışırken aşağıdakine benzer. 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.
iOS
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:
- Veritabanı dosyası oluşturma
- Nesneleri oluşturup kaydederek veri ekleme
- Veriyi sorgulama
Şu ad alanlarını eklemeniz gerekir:
using SQLite; // from the github SQLite.cs class
Bu, burada vurgulandığı gibi projenize SQLite eklemenizi gerektirir. 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 için veya otomatik olarak çözümlenemeyen koleksiyonları modelleyen özellikler SQLite olduğunda 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 (
Query
değ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
Koleksiyon döndüren yöntemler IEnumerable<T'yi> destekler, böylece tablonun içeriğini sorgulamak veya sıralamak için Linq kullanabilirsiniz. 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);
}
Önemli
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 ad alanında bulunan öğesini çağırın SqliteConnection.SetConfig
Mono.Data.Sqlite
. Örneğin, bu kod satırı Serileştirilmiş mod için SQLite'i yapılandırıyor :
using Mono.Data.Sqlite;
...
SqliteConnection.SetConfig(SQLiteConfig.Serialized);