Xamarin.iOS에서 ADO.NET 사용
Xamarin은 친숙한 ADO를 사용하여 노출되는 iOS에서 사용할 수 있는 SQLite 데이터베이스에 대한 기본 제공 지원을 제공합니다. NET과 유사한 구문입니다. 이러한 API를 사용하려면 SQLite에서 처리되는 SQL 문(예: CREATE TABLE
INSERT
SELECT
문)을 작성해야 합니다.
어셈블리 참조
ADO.NET 통해 액세스 SQLite를 사용하려면 여기에 표시된 대로 iOS 프로젝트를 추가하고 System.Data
Mono.Data.Sqlite
참조해야 합니다(Mac용 Visual Studio 및 Visual Studio의 샘플용).
참조 편집 참조를 > 마우스 오른쪽 단추로 클릭한 다음 클릭하여 필요한 어셈블리를 선택합니다.
Mono.Data.Sqlite 정보
클래스를 Mono.Data.Sqlite.SqliteConnection
사용하여 빈 데이터베이스 파일을 만든 다음 데이터베이스에 대해 SQL 지침을 실행하는 데 사용할 수 있는 개체를 인스턴스화 SqliteCommand
합니다.
빈 데이터베이스 만들기 - 유효한 파일 경로(예: 쓰기 가능)를 사용하여 메서드를 호출
CreateFile
합니다. 이 메서드를 호출하기 전에 파일이 이미 있는지 여부를 검사 합니다. 그렇지 않으면 이전 데이터베이스의 맨 위에 새(빈) 데이터베이스가 만들어지고 이전 파일의 데이터가 손실됩니다.Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath);
참고 항목
변수는 이
dbPath
문서의 앞부분에서 설명한 규칙에 따라 결정되어야 합니다.Database 커넥트ion 만들기 - SQLite 데이터베이스 파일을 만든 후 연결 개체를 만들어 데이터에 액세스할 수 있습니다. 연결은 다음과 같이 형식
Data Source=file_path
을 사용하는 연결 문자열 사용하여 생성됩니다.var connection = new SqliteConnection ("Data Source=" + dbPath); connection.Open(); // do stuff connection.Close();
앞에서 멘션 다른 스레드에서 연결을 다시 사용해서는 안 됩니다. 확실하지 않은 경우 필요에 따라 연결을 만들고 완료되면 연결을 닫습니다. 하지만 필요 이상으로 자주 이 작업을 수행하는 것을 염두에 두어야 합니다.
데이터베이스 명령 만들기 및 실행 - 연결이 되면 임의 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에서 실행할 때 다음과 같습니다.
아래 코드는 간단한 SQLite 작업을 수행하는 방법을 보여 줍니다. 결과를 애플리케이션의 기본 창에 텍스트로 표시합니다.
다음 네임스페이스를 포함해야 합니다.
using System;
using System.IO;
using Mono.Data.Sqlite;
다음 코드 샘플은 전체 데이터베이스 상호 작용을 보여줍니다.
- 데이터베이스 파일 만들기
- 일부 데이터 삽입
- 데이터 쿼리
이러한 작업은 일반적으로 코드 전체의 여러 위치에 표시됩니다. 예를 들어 애플리케이션이 처음 시작될 때 데이터베이스 파일 및 테이블을 만들고 앱의 개별 화면에서 데이터 읽기 및 쓰기를 수행할 수 있습니다. 아래 예제에서는 이 예제에 대해 단일 메서드로 그룹화되었습니다.
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();