Xamarin.iOS에서 ADO.NET 사용

Xamarin은 친숙한 ADO를 사용하여 노출되는 iOS에서 사용할 수 있는 SQLite 데이터베이스에 대한 기본 제공 지원을 제공합니다. NET과 유사한 구문입니다. 이러한 API를 사용하려면 SQLite에서 처리되는 SQL 문(예: CREATE TABLEINSERTSELECT 문)을 작성해야 합니다.

어셈블리 참조

ADO.NET 통해 액세스 SQLite를 사용하려면 여기에 표시된 대로 iOS 프로젝트를 추가하고 System.DataMono.Data.Sqlite 참조해야 합니다(Mac용 Visual Studio 및 Visual Studio의 샘플용).

참조 편집 참조를 > 마우스 오른쪽 단추로 클릭한 다음 클릭하여 필요한 어셈블리를 선택합니다.

Mono.Data.Sqlite 정보

클래스를 Mono.Data.Sqlite.SqliteConnection 사용하여 빈 데이터베이스 파일을 만든 다음 데이터베이스에 대해 SQL 지침을 실행하는 데 사용할 수 있는 개체를 인스턴스화 SqliteCommand 합니다.

  1. 빈 데이터베이스 만들기 - 유효한 파일 경로(예: 쓰기 가능)를 사용하여 메서드를 호출 CreateFile 합니다. 이 메서드를 호출하기 전에 파일이 이미 있는지 여부를 검사 합니다. 그렇지 않으면 이전 데이터베이스의 맨 위에 새(빈) 데이터베이스가 만들어지고 이전 파일의 데이터가 손실됩니다.

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

    참고 항목

    변수는 이 dbPath 문서의 앞부분에서 설명한 규칙에 따라 결정되어야 합니다.

  2. Database 커넥트ion 만들기 - SQLite 데이터베이스 파일을 만든 후 연결 개체를 만들어 데이터에 액세스할 수 있습니다. 연결은 다음과 같이 형식Data Source=file_path을 사용하는 연결 문자열 사용하여 생성됩니다.

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

    앞에서 멘션 다른 스레드에서 연결을 다시 사용해서는 안 됩니다. 확실하지 않은 경우 필요에 따라 연결을 만들고 완료되면 연결을 닫습니다. 하지만 필요 이상으로 자주 이 작업을 수행하는 것을 염두에 두어야 합니다.

  3. 데이터베이스 명령 만들기 및 실행 - 연결이 되면 임의 SQL 명령을 실행할 수 있습니다. 아래 코드는 실행 중인 CREATE TABLE 문을 보여줍니다.

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

데이터베이스에 대해 SQL을 직접 실행할 때는 이미 존재하는 테이블을 만들려고 시도하는 등 잘못된 요청을 하지 않도록 일반적인 예방 조치를 취해야 합니다. "SQLite 오류 테이블 [항목]이 이미 있음"과 같은 SqliteException이 발생하지 않도록 데이터베이스 구조를 추적합니다.

기본 데이터 액세스

이 문서의 DataAccess_Basic 샘플 코드는 iOS에서 실행할 때 다음과 같습니다.

iOS ADO.NET sample

아래 코드는 간단한 SQLite 작업을 수행하는 방법을 보여 줍니다. 결과를 애플리케이션의 기본 창에 텍스트로 표시합니다.

다음 네임스페이스를 포함해야 합니다.

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

다음 코드 샘플은 전체 데이터베이스 상호 작용을 보여줍니다.

  1. 데이터베이스 파일 만들기
  2. 일부 데이터 삽입
  3. 데이터 쿼리

이러한 작업은 일반적으로 코드 전체의 여러 위치에 표시됩니다. 예를 들어 애플리케이션이 처음 시작될 때 데이터베이스 파일 및 테이블을 만들고 앱의 개별 화면에서 데이터 읽기 및 쓰기를 수행할 수 있습니다. 아래 예제에서는 이 예제에 대해 단일 메서드로 그룹화되었습니다.

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 ();
}

더 복잡한 쿼리

SQLite를 사용하면 데이터에 대해 임의의 SQL 명령을 실행할 수 있으므로 원하는 CREATE, INSERT, UPDATE, DELETE 또는 SELECT 문을 수행할 수 있습니다. Sqlite 웹 사이트에서 SQLite에서 지원하는 SQL 명령에 대해 읽을 수 있습니다. SQL 문은 SqliteCommand 개체의 세 가지 메서드 중 하나를 사용하여 실행됩니다.

  • ExecuteNonQuery – 일반적으로 테이블 생성 또는 데이터 삽입에 사용됩니다. 일부 작업의 반환 값은 영향을 받는 행 수이고, 그렇지 않으면 -1입니다.
  • ExecuteReader – 행 컬렉션을 로 반환 SqlDataReader 해야 하는 경우에 사용됩니다.
  • ExecuteScalar – 단일 값(예: 집계)을 검색합니다.

EXECUTENONQUERY

INSERT, UPDATE 및 DELETE 문은 영향을 받는 행 수를 반환합니다. 다른 모든 SQL 문은 -1을 반환합니다.

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

EXECUTEREADER

다음 메서드는 SELECT 문의 WHERE 절을 보여줍니다. 코드가 전체 SQL 문을 작성하므로 문자열 주위에 따옴표(')와 같은 예약된 문자를 이스케이프해야 합니다.

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 메서드는 SqliteDataReader 개체를 반환합니다. 예제에 표시된 Read 메서드 외에도 다른 유용한 속성은 다음과 같습니다.

  • RowsAffected – 쿼리의 영향을 받는 행의 수입니다.
  • HasRows – 행이 반환되었는지 여부입니다.

EXECUTESCALAR

단일 값(예: 집계)을 반환하는 SELECT 문에 사용합니다.

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

ExecuteScalar 메서드의 반환 형식은 object 데이터베이스 쿼리에 따라 결과를 캐스팅해야 합니다. 결과는 COUNT 쿼리의 정수이거나 단일 열 SELECT 쿼리의 문자열일 수 있습니다. 이는 판독기 개체 또는 영향을 받는 행 수의 수를 반환하는 다른 Execute 메서드와 다릅니다.

Microsoft.Data.Sqlite

NuGet에서 설치할 수 있는 다른 라이브러리Microsoft.Data.Sqlite는 기능적으로 동일 Mono.Data.Sqlite 하며 동일한 유형의 쿼리를 허용합니다.

두 라이브러리와 일부 Xamarin 관련 세부 정보를 비교합니다. Xamarin.iOS 앱에서 가장 중요한 것은 초기화 호출을 포함해야 합니다.

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