Xamarin.iOS에서 SQLite.NET 사용

Xamarin에서 권장하는 SQLite.NET 라이브러리는 iOS 디바이스의 로컬 SQLite 데이터베이스에 개체를 저장하고 검색할 수 있는 기본 ORM입니다. ORM은 SQL 문을 작성하지 않고 데이터베이스에서 "개체"를 저장하고 검색할 수 있는 API인 개체 관계형 매핑을 의미합니다.

사용

Xamarin 앱에 SQLite.NET 라이브러리를 포함하려면 프로젝트에 다음 NuGet 패키지를 추가합니다.

SQLite.NET NuGet package

다양한 SQLite 패키지를 사용할 수 있습니다. 올바른 패키지를 선택해야 합니다(검색에서 상위 결과가 아닐 수 있음).

Important

SQLite.NET praeclarum/sqlite-net 리포지토리에서 지원되는 타사 라이브러리입니다.

SQLite.NET 라이브러리를 사용할 수 있게 되면 다음 세 단계에 따라 데이터베이스에 액세스하는 데 사용합니다.

  1. using 문 추가 - 데이터 액세스가 필요한 C# 파일에 다음 문을 추가합니다.

    using SQLite;
    
  2. 빈 데이터베이스 만들기 - SQLite커넥트ion 클래스 생성자의 파일 경로를 전달하여 데이터베이스 참조를 만들 수 있습니다. 파일이 이미 있는 경우 검사 필요가 없습니다. 필요한 경우 자동으로 만들어지고, 그렇지 않으면 기존 데이터베이스 파일이 열립니다.

    var db = new SQLiteConnection (dbPath);
    

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

  3. 데이터 저장 - SQLite커넥트ion 개체를 만든 후에는 CreateTable 및 Insert와 같은 메서드를 호출하여 데이터베이스 명령을 실행합니다.

    db.CreateTable<Stock> ();
    db.Insert (newStock); // after creating the newStock object
    
  4. 데이터 검색 - 개체(또는 개체 목록)를 검색하려면 다음 구문을 사용합니다.

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

기본 데이터 액세스 샘플

이 문서의 DataAccess_Basic 샘플 코드는 iOS에서 실행할 때 다음과 같습니다. 이 코드는 간단한 SQLite.NET 작업을 수행하는 방법을 보여 줍니다. 결과를 애플리케이션의 기본 창에 텍스트로 표시합니다.

iOS

iOS SQLite.NET sample

다음 코드 샘플에서는 SQLite.NET 라이브러리를 사용하여 기본 데이터베이스 액세스를 캡슐화하는 전체 데이터베이스 상호 작용을 보여 줍니다. 다음을 보여줍니다.

  1. 데이터베이스 파일 만들기
  2. 개체를 만든 다음 저장하여 일부 데이터 삽입
  3. 데이터 쿼리

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

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

이렇게 하려면 여기에 강조 표시된 대로 프로젝트에 SQLite를 추가해야 합니다. SQLite 데이터베이스 테이블은 CREATE TABLE 명령이 아닌 클래스(클래스)에 Stock 특성을 추가하여 정의됩니다.

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

[Table] 테이블 이름 매개 변수를 지정하지 않고 특성을 사용하면 기본 데이터베이스 테이블의 이름이 클래스와 동일합니다(이 경우 "Stock"). 실제 테이블 이름은 ORM 데이터 액세스 방법을 사용하는 대신 데이터베이스에 대해 직접 SQL 쿼리를 작성하는 경우에 중요합니다. 마찬가지로 [Column("_id")] 특성은 선택 사항이며, 열이 없는 경우 클래스의 속성과 이름이 같은 테이블에 열이 추가됩니다.

SQLite 특성

기본 데이터베이스에 저장되는 방법을 제어하기 위해 클래스에 적용할 수 있는 일반적인 특성은 다음과 같습니다.

  • [PrimaryKey] – 이 특성을 정수 속성에 적용하여 기본 테이블의 기본 키로 강제 적용할 수 있습니다. 복합 기본 키는 지원되지 않습니다.
  • [자동 증가] – 이 특성으로 인해 데이터베이스에 삽입된 각 새 개체에 대해 정수 속성 값이 자동으로 증가합니다.
  • [Column(name)] – 매개 변수는 name 기본 데이터베이스 열의 이름을 설정합니다.
  • [Table(name)] – 지정된 이름을 사용하여 기본 SQLite 테이블에 클래스를 저장할 수 있는 것으로 표시합니다.
  • [MaxLength(value)] – 데이터베이스 삽입을 시도할 때 텍스트 속성의 길이를 제한합니다. 이 특성은 데이터베이스 삽입 또는 업데이트 작업을 시도할 때만 '검사ed'이므로 개체를 삽입하기 전에 코드를 사용하여 유효성을 검사해야 합니다.
  • [무시] – SQLite.NET 이 속성을 무시합니다. 이 기능은 데이터베이스에 저장할 수 없는 형식이 있는 속성 또는 자동으로 확인할 수 없는 컬렉션을 SQLite로 모델링하는 속성에 특히 유용합니다.
  • [고유] – 기본 데이터베이스 열의 값이 고유한지 확인합니다.

이러한 특성의 대부분은 선택 사항입니다. 데이터에서 선택 및 삭제 쿼리를 효율적으로 수행할 수 있도록 항상 정수 기본 키를 지정해야 합니다.

더 복잡한 쿼리

다음 메서드를 SQLiteConnection 사용하여 다른 데이터 작업을 수행할 수 있습니다.

  • 삽입 – 데이터베이스에 새 개체를 추가합니다.
  • Get<T> – 기본 키를 사용하여 개체를 검색하려고 시도합니다.
  • 테이블 T> – 테이블<의 모든 개체를 반환합니다.
  • 삭제 – 기본 키를 사용하여 개체를 삭제합니다.
  • 쿼리<T> - 여러 행(개체)을 반환하는 SQL 쿼리를 수행합니다.
  • Execute – SQL에서 행이 다시 표시되지 않을 때(예: INSERT, UPDATE 및 DELETE 명령) 이 메서드를 사용하지 마세요 Query .

기본 키로 개체 가져오기

SQLite.Net 기본 키를 기반으로 단일 개체를 검색하는 Get 메서드를 제공합니다.

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

Linq를 사용하여 개체 선택

컬렉션을 반환하는 메서드는 Linq를 사용하여 테이블 내용을 쿼리하거나 정렬할 수 있도록 IEnumerable<T> 를 지원합니다. 다음 코드는 Linq를 사용하여 문자 "A"로 시작하는 모든 항목을 필터링하는 예제를 보여줍니다.

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

SQL을 사용하여 개체 선택

SQLite.Net 데이터에 대한 개체 기반 액세스를 제공할 수 있지만 Linq에서 허용하는 것보다 더 복잡한 쿼리를 수행해야 할 수도 있습니다(또는 더 빠른 성능이 필요할 수 있음). 다음과 같이 쿼리 메서드와 함께 SQL 명령을 사용할 수 있습니다.

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

Important

SQL 문을 직접 작성할 때 클래스 및 해당 특성에서 생성된 데이터베이스의 테이블 및 열 이름에 대한 종속성을 만듭니다. 코드에서 해당 이름을 변경하는 경우 수동으로 작성된 SQL 문을 업데이트해야 합니다.

개체 삭제

기본 키는 다음과 같이 행을 삭제하는 데 사용됩니다.

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

검사 rowcount 영향을 받은 행 수를 확인할 수 있습니다(이 경우 삭제됨).

여러 스레드에서 SQLite.NET 사용

SQLite는 단일 스레드, 다중 스레드직렬화된 세 가지 스레딩 모드를 지원합니다. 제한 없이 여러 스레드에서 데이터베이스에 액세스하려는 경우 직렬화된 스레딩 모드를 사용하도록 SQLite를 구성할 수 있습니다. 애플리케이션에서 이 모드를 초기에 설정하는 것이 중요합니다(예: 메서드의 OnCreate 시작 부분).

스레딩 모드를 변경하려면 네임스페이스에 있는 스레딩 모드를 Mono.Data.Sqlite 호출 SqliteConnection.SetConfig 합니다. 예를 들어 이 코드 줄은 직렬화된 모드에 대해 SQLite를 구성합니다.

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