Xamarin.ios에서 SQLite 구성Configuring SQLite in Xamarin.iOS

Xamarin.ios 응용 프로그램에서 SQLite를 사용 하려면 데이터베이스 파일에 대 한 올바른 파일 위치를 확인 해야 합니다.To use SQLite in your Xamarin.iOS application you will need to determine the correct file location for your database file.

데이터베이스 파일 경로Database File Path

사용 하는 데이터 액세스 방법에 관계 없이 데이터베이스 파일을 만든 후에 SQLite를 사용 하 여 데이터를 저장 해야 합니다.Regardless of which data access method you use, you must create a database file before data can be stored with SQLite. 파일 위치를 대상으로 하는 플랫폼에 따라 달라 집니다.Depending on what platform you are targeting the file location will be different. IOS의 경우 다음 코드 조각과 같이 환경 클래스를 사용 하 여 유효한 경로를 생성할 수 있습니다.For iOS you can use Environment class to construct a valid path, as shown in the following code snippet:

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

데이터베이스 파일을 저장할 위치를 결정할 때 고려해 야 할 다른 사항이 있습니다.There are other things to take into consideration when deciding where to store the database file. IOS에서 데이터베이스를 자동으로 백업 (또는 그렇지 않음) 할 수 있습니다.On iOS you may want the database to backed-up automatically (or not).

플랫폼 간 응용 프로그램의 각 플랫폼에서 다른 위치를 사용 하려는 경우 표시 된 것 처럼 컴파일러 지시문을 사용 하 여 각 플랫폼에 대해 다른 경로를 생성할 수 있습니다.If you wish to use a different location on each platform in your cross platform application you can use a compiler directive as shown to generate a different path for each platform:

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에서 사용할 파일 위치에 대 한 자세한 내용은 파일 시스템 작업 문서를 참조 하세요.Refer to the Working with the File System article for more information on what file locations to use on iOS. 컴파일러 지시문을 사용 하 여 각 플랫폼과 관련 된 코드를 작성 하는 방법에 대 한 자세한 내용은 플랫폼 간 응용 프로그램 빌드 문서를 참조 하세요.See the Building Cross Platform Applications document for more information on using compiler directives to write code specific to each platform.

스레딩Threading

여러 스레드에서 동일한 SQLite 데이터베이스 연결을 사용 하면 안 됩니다.You should not use the same SQLite database connection across multiple threads. 를 열고 사용한 다음 동일한 스레드에서 만든 모든 연결을 닫아야 합니다.Be careful to open, use and then close any connections you create on the same thread.

코드가 여러 스레드에서 동시에 SQLite 데이터베이스에 액세스 하려고 하지 않도록 하려면 다음과 같이 데이터베이스에 액세스할 때마다 수동으로 잠금을 수행 합니다.To ensure that your code is not attempting to access the SQLite database from multiple threads at the same time, manually take a lock whenever you are going to access the database, like this:

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

모든 데이터베이스 액세스 (읽기, 쓰기, 업데이트 등)는 동일한 잠금으로 래핑해야 합니다.All database access (reads, writes, updates, etc) should be wrapped with the same lock. Lock 절 내의 작업을 간단 하 게 유지 하 고 잠금을 사용할 수 있는 다른 메서드를 호출 하지 않도록 하 여 교착 상태 상황을 방지 하려면 주의를 기울여야 합니다.Care must be taken to avoid a deadlock situation by ensuring that the work inside the lock clause is kept simple and does not call out to other methods that may also take a lock!