Aracılığıyla paylaş


Xamarin.iOS ile ADO.NET kullanma

Xamarin, tanıdık ADO kullanılarak kullanıma sunulan iOS'ta bulunan SQLite veritabanı için yerleşik desteğe sahiptir. NET benzeri söz dizimi. Bu API'leri kullanmak için SQLite tarafından işlenen , INSERT ve SELECT deyimleri gibi CREATE TABLESQL deyimleri yazmanız gerekir.

Derleme Başvuruları

ADO.NET aracılığıyla erişim SQLite'i kullanmak için, burada gösterildiği gibi iOS projenize ve Mono.Data.Sqlite başvurular eklemeniz System.Data gerekir (Mac için Visual Studio ve Visual Studio'daki örnekler için):

Başvurular > Başvuruları Düzenle... öğesine sağ tıklayın ve ardından gerekli derlemeleri seçmek için tıklayın.

Mono.Data.Sqlite Hakkında

boş bir veritabanı dosyası oluşturmak ve ardından veritabanında SQL yönergelerini yürütmek için kullanabileceğimiz nesnelerin örneğini SqliteCommand oluşturmak için sınıfını kullanacağızMono.Data.Sqlite.SqliteConnection.

  1. Boş Veritabanı Oluşturma - Geçerli (yazılabilir) bir dosya yolu ile yöntemini çağırın CreateFile . Bu yöntemi çağırmadan önce dosyanın zaten var olup olmadığını denetlemeniz gerekir, aksi takdirde eski dosyanın üst kısmında yeni bir (boş) veritabanı oluşturulur ve eski dosyadaki veriler kaybolur:

    Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath);

    Not

    Değişken, dbPath bu belgenin önceki bölümlerinde açıklanan kurallara göre belirlenmelidir.

  2. Veritabanı Bağlan oluşturma - SQLite veritabanı dosyası oluşturulduktan sonra verilere erişmek için bir bağlantı nesnesi oluşturabilirsiniz. Bağlantı, burada gösterildiği gibi biçiminde Data Source=file_pathbir bağlantı dizesi oluşturulur:

    var connection = new SqliteConnection ("Data Source=" + dbPath);
    connection.Open();
    // do stuff
    connection.Close();
    

    Daha önce belirtildiği gibi, bir bağlantı hiçbir zaman farklı iş parçacıkları arasında yeniden kullanılmamalıdır. Şüpheniz varsa, bağlantıyı gerektiği gibi oluşturun ve işiniz bittiğinde kapatın; ancak bunu gerektiğinden daha sık yapma hakkında da dikkatli olun.

  3. Veritabanı Komutu Oluşturma ve Yürütme - Bir bağlantı oluşturduktan sonra buna karşı rastgele SQL komutları yürütebiliriz. Aşağıdaki kod yürütülmekte olan bir CREATE TABLE deyimini gösterir.

    using (var command = connection.CreateCommand ()) {
        command.CommandText = "CREATE TABLE [Items] ([_id] int, [Symbol] ntext, [Name] ntext);";
        var rowcount = command.ExecuteNonQuery ();
    }
    

SQL'i doğrudan veritabanına karşı yürütürken, zaten var olan bir tablo oluşturmaya çalışma gibi geçersiz isteklerde bulunmamak için normal önlemleri almanız gerekir. "SQLite hata tablosu [Öğeler] zaten var" gibi bir SqliteException'a neden olmayacak şekilde veritabanınızın yapısını izleyin.

Temel Veri Erişimi

Bu belgenin DataAccess_Basic örnek kodu iOS üzerinde çalışırken şöyle görünür:

iOS ADO.NET sample

Aşağıdaki kod, basit SQLite işlemlerinin nasıl gerçekleştiriltiğini gösterir ve sonuçları uygulamanın ana penceresinde metin olarak gösterir.

Şu ad alanlarını eklemeniz gerekir:

using System;
using System.IO;
using Mono.Data.Sqlite;

Aşağıdaki kod örneği, veritabanı etkileşiminin tamamını gösterir:

  1. Veritabanı dosyası oluşturma
  2. Veri ekleme
  3. Veriyi sorgulama

Bu işlemler genellikle kodunuzun tamamında birden çok yerde görünür. Örneğin, uygulamanız ilk kez başlatıldığında veritabanı dosyasını ve tablolarını oluşturabilir ve uygulamanızdaki tek tek ekranlarda veri okuma ve yazma işlemleri gerçekleştirebilirsiniz. Aşağıdaki örnekte, bu örnek için tek bir yöntem halinde gruplandırılmıştır:

public static SqliteConnection connection;
public static string DoSomeDataAccess ()
{
    // determine the path for the database file
    string dbPath = Path.Combine (
        Environment.GetFolderPath (Environment.SpecialFolder.Personal),
        "adodemo.db3");

    bool exists = File.Exists (dbPath);

    if (!exists) {
        Console.WriteLine("Creating database");
        // Need to create the database before seeding it with some data
        Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath);
        connection = new SqliteConnection ("Data Source=" + dbPath);

        var commands = new[] {
            "CREATE TABLE [Items] (_id ntext, Symbol ntext);",
            "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('1', 'AAPL')",
            "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('2', 'GOOG')",
            "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('3', 'MSFT')"
        };
        // Open the database connection and create table with data
        connection.Open ();
        foreach (var command in commands) {
            using (var c = connection.CreateCommand ()) {
                c.CommandText = command;
                var rowcount = c.ExecuteNonQuery ();
                Console.WriteLine("\tExecuted " + command);
            }
        }
    } else {
        Console.WriteLine("Database already exists");
        // Open connection to existing database file
        connection = new SqliteConnection ("Data Source=" + dbPath);
        connection.Open ();
    }

    // query the database to prove data was inserted!
    using (var contents = connection.CreateCommand ()) {
        contents.CommandText = "SELECT [_id], [Symbol] from [Items]";
        var r = contents.ExecuteReader ();
        Console.WriteLine("Reading data");
        while (r.Read ())
            Console.WriteLine("\tKey={0}; Value={1}",
                              r ["_id"].ToString (),
                              r ["Symbol"].ToString ());
    }
    connection.Close ();
}

Daha Karmaşık Sorgular

SQLite veriler üzerinde rastgele SQL komutlarının çalıştırılmasına izin verdiğinden, istediğiniz CREATE, INSERT, UPDATE, DELETE veya SELECT deyimlerini gerçekleştirebilirsiniz. Sqlite web sitesinde SQLite tarafından desteklenen SQL komutları hakkında bilgi edinebilirsiniz. SQL deyimleri bir SqliteCommand nesnesinde üç yöntemden biri kullanılarak çalıştırılır:

  • ExecuteNonQuery – Genellikle tablo oluşturma veya veri ekleme için kullanılır. Bazı işlemlerin dönüş değeri etkilenen satır sayısıdır, aksi takdirde -1 olur.
  • ExecuteReader – Bir satır koleksiyonu olarak SqlDataReader döndürülmesi gerektiğinde kullanılır.
  • ExecuteScalar : Tek bir değer (örneğin bir toplama) alır.

EXECUTENONQUERY

INSERT, UPDATE ve DELETE deyimleri etkilenen satır sayısını döndürür. Diğer tüm SQL deyimleri -1 döndürür.

using (var c = connection.CreateCommand ()) {
    c.CommandText = "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('1', 'APPL')";
    var rowcount = c.ExecuteNonQuery (); // rowcount will be 1
}

EXECUTEREADER

Aşağıdaki yöntem SELECT deyiminde WHERE yan tümcesini gösterir. Kod tam bir SQL deyimi oluşturduğundan, dizeler etrafında tırnak işareti (') gibi ayrılmış karakterlerin kaçmasına dikkat edilmelidir.

public static string MoreComplexQuery ()
{
    var output = "";
    output += "\nComplex query example: ";
    string dbPath = Path.Combine (
        Environment.GetFolderPath (Environment.SpecialFolder.Personal), "ormdemo.db3");

    connection = new SqliteConnection ("Data Source=" + dbPath);
    connection.Open ();
    using (var contents = connection.CreateCommand ()) {
        contents.CommandText = "SELECT * FROM [Items] WHERE Symbol = 'MSFT'";
        var r = contents.ExecuteReader ();
        output += "\nReading data";
        while (r.Read ())
            output += String.Format ("\n\tKey={0}; Value={1}",
                    r ["_id"].ToString (),
                    r ["Symbol"].ToString ());
    }
    connection.Close ();

    return output;
}

ExecuteReader yöntemi bir SqliteDataReader nesnesi döndürür. Örnekte gösterilen Read yöntemine ek olarak, diğer yararlı özellikler şunlardır:

  • Etkilenen Satırlar : Sorgudan etkilenen satırların sayısı.
  • HasRows – Herhangi bir satırın döndürülip döndürülmediği.

EXECUTESCALAR

Tek bir değer (toplama gibi) döndüren SELECT deyimleri için bunu kullanın.

using (var contents = connection.CreateCommand ()) {
    contents.CommandText = "SELECT COUNT(*) FROM [Items] WHERE Symbol <> 'MSFT'";
    var i = contents.ExecuteScalar ();
}

Yöntemin ExecuteScalar dönüş türü: object Sonucu veritabanı sorgusuna bağlı olarak atamanız gerekir. Sonuç, COUNT sorgusundan bir tamsayı veya tek sütunlu SELECT sorgusundan bir dize olabilir. Bunun, okuyucu nesnesi döndüren diğer Execute yöntemlerinden veya etkilenen satır sayısının sayısından farklı olduğunu unutmayın.

Microsoft.Data.Sqlite

NuGet'ten yüklenebilen ve işlevsel olarak aynı sorgu türlerine Mono.Data.Sqlite izin veren başka bir kitaplık Microsoft.Data.Sqlitevardır.

İki kitaplık ile Xamarin'e özgü bazı ayrıntılar arasında bir karşılaştırma vardır. Xamarin.iOS uygulamaları için en önemlisi, bir başlatma çağrısı eklemeniz gerekir:

// required for Xamarin.iOS
SQLitePCL.Batteries_V2.Init();