Share via


Xamarin.iOS에서 SQLite 구성

Xamarin.iOS 애플리케이션에서 SQLite를 사용하려면 데이터베이스 파일의 올바른 파일 위치를 결정해야 합니다.

데이터베이스 파일 경로

사용하는 데이터 액세스 방법에 관계없이 SQLite를 사용하여 데이터를 저장하려면 먼저 데이터베이스 파일을 만들어야 합니다. 파일 위치를 대상으로 하는 플랫폼에 따라 다릅니다. iOS의 경우 다음 코드 조각과 같이 Environment 클래스를 사용하여 유효한 경로를 생성할 수 있습니다.

string dbPath = Path.Combine (
        Environment.GetFolderPath (Environment.SpecialFolder.Personal),
        "database.db3");
// dbPath contains a valid file path for the database file to be stored

데이터베이스 파일을 저장할 위치를 결정할 때 고려해야 할 다른 사항이 있습니다. iOS에서는 데이터베이스가 자동으로 백업되도록 할 수 있습니다(또는 그렇지 않음).

플랫폼 간 애플리케이션의 각 플랫폼에서 다른 위치를 사용하려는 경우 표시된 대로 컴파일러 지시문을 사용하여 각 플랫폼에 대해 다른 경로를 생성할 수 있습니다.

var sqliteFilename = "MyDatabase.db3";
#if __ANDROID__
// Just use whatever directory SpecialFolder.Personal returns
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;
#else
// we need to put in /Library/ on iOS5.1+ to meet Apple's iCloud terms
// (they don't want non-user-generated data in Documents)
string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
string libraryPath = Path.Combine (documentsPath, "..", "Library"); // Library folder instead
#endif
var path = Path.Combine (libraryPath, sqliteFilename);

iOS에서 사용할 파일 위치에 대한 자세한 내용은 파일 시스템 작업 문서를 참조하세요. 컴파일러 지시문을 사용하여 각 플랫폼과 관련된 코드를 작성하는 방법에 대한 자세한 내용은 플랫폼 간 애플리케이션 빌드 문서를 참조하세요.

스레딩

여러 스레드에서 동일한 SQLite 데이터베이스 연결을 사용하면 안 됩니다. 동일한 스레드에서 만든 모든 연결을 열고, 사용하고, 닫아야 합니다.

코드가 여러 스레드에서 동시에 SQLite 데이터베이스에 액세스하지 않도록 하려면 다음과 같이 데이터베이스에 액세스할 때마다 수동으로 잠금을 적용합니다.

object locker = new object(); // class level private field
// rest of class code
lock (locker){
    // Do your query or insert here
}

모든 데이터베이스 액세스(읽기, 쓰기, 업데이트 등)는 동일한 잠금으로 래핑되어야 합니다. 잠금 절 내의 작업이 단순하게 유지되고 잠금을 취할 수 있는 다른 메서드를 호출하지 않도록 하여 교착 상태 상황을 방지하려면 주의해야 합니다.