在 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
}

所有数据库访问(读取、写入、更新等)都应使用相同的锁进行包装。 必须注意避免死锁情况,确保 lock 子句内的工作保持简单,并且不会调用可能也可以获取锁的其他方法!