Configuración de SQLite en Xamarin.iOS

Para usar SQLite en la aplicación de Xamarin.iOS, deberá determinar la ubicación de archivo correcta para el archivo de base de datos.

Ruta de acceso del archivo de base de datos

Independientemente del método de acceso a datos que use, debe crear un archivo de base de datos para que los datos se puedan almacenar con SQLite. Dependiendo de la plataforma que tenga como destino la ubicación del archivo será diferente. Para iOS, puede usar la clase Environment para construir una ruta de acceso válida, como se muestra en el siguiente fragmento de código:

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

Hay otras cosas que se deben tener en cuenta al decidir dónde almacenar el archivo de base de datos. En iOS, es posible que quiera que la base de datos se haga una copia de seguridad automáticamente (o no).

Si desea usar una ubicación diferente en cada plataforma de la aplicación multiplataforma, puede usar una directiva del compilador, como se muestra para generar una ruta de acceso diferente para cada plataforma:

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

Consulte el artículo Trabajar con el sistema de archivos para obtener más información sobre las ubicaciones de archivos que se van a usar en iOS. Consulte el documento Creación de aplicaciones multiplataforma para obtener más información sobre el uso de directivas del compilador para escribir código específico para cada plataforma.

Subprocesos

No debe usar la misma conexión de base de datos de SQLite en varios subprocesos. Tenga cuidado de abrir, usar y cerrar las conexiones que cree en el mismo subproceso.

Para asegurarse de que el código no intenta acceder a la base de datos de SQLite desde varios subprocesos al mismo tiempo, tome manualmente un bloqueo cada vez que vaya a acceder a la base de datos, de la siguiente manera:

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

Todo el acceso a la base de datos (lecturas, escrituras, actualizaciones, etc) debe encapsularse con el mismo bloqueo. Se debe tener cuidado para evitar una situación de interbloqueo asegurándose de que el trabajo dentro de la cláusula de bloqueo se mantiene sencillo y no llama a otros métodos que también pueden tomar un bloqueo.