2009-04-04 10 views
32

Cuando inicialmente creo un archivo de base de datos SQLite con datasets preincorporados para mi aplicación, tendría que colocar este archivo en algún lugar de mi proyecto Xcode para que vaya a mi aplicación de iPhone. Supongo que "recursos" es el lugar correcto para eso.¿Dónde ubicaría su archivo de base de datos SQLite en una aplicación de iPhone?

¿Cuáles son los "pasos" básicos para la implementación de un archivo de base de datos SQLite en una aplicación de iPhone?

  • creación de la base de datos manualmente
  • añadir el archivo de base de datos para el proyecto (¿dónde?)

Actualmente estoy leyendo toda la documentación de SQLite, aunque eso no hay mucho relacionado iPhone.

Respuesta

70

Primero debe agregar el archivo SQLite a su proyecto Xcode; el lugar más adecuado es en la carpeta de recursos.

Luego, en el archivo de código delegado de su aplicación, en el método appDidFinishLaunching, primero debe comprobar si ya se ha creado una copia grabable del archivo SQLite, es decir, se ha creado una copia del archivo SQLite en los usuarios carpeta de documentos en el sistema de archivos del iPhone. En caso afirmativo, no debe hacer nada (de lo contrario lo sobreescribiría con la copia Xcode SQLite predeterminada)

En caso negativo, copie el archivo SQLite allí para que pueda escribirse.

Véase el ejemplo de código siguiente para hacer esto: esto ha sido tomado de ejemplo de código SQLite libros de Apple, donde este método se llama a partir de los delegados de aplicaciones método appDidFinishLaunching.

// Creates a writable copy of the bundled default database in the application Documents directory. 
- (void)createEditableCopyOfDatabaseIfNeeded { 
    // First, test for existence. 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bookdb.sql"]; 
    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if (success) 
     return; 
    // The writable database does not exist, so copy the default to the appropriate location. 
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"bookdb.sql"]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
    if (!success) { 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
} 

============

Aquí está el código anterior en Swift 2.0+

// Creates a writable copy of the bundled default database in the application Documents directory. 
private func createEditableCopyOfDatabaseIfNeeded() -> Void 
{ 
    // First, test for existence. 
    let fileManager: NSFileManager = NSFileManager.defaultManager(); 
    let paths:NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
    let documentsDirectory:NSString = paths.objectAtIndex(0) as! NSString; 
    let writableDBPath:String = documentsDirectory.stringByAppendingPathComponent("bookdb.sql"); 

    if (fileManager.fileExistsAtPath(writableDBPath) == true) 
    { 
     return 
    } 
    else // The writable database does not exist, so copy the default to the appropriate location. 
    { 
     let defaultDBPath = NSBundle.mainBundle().pathForResource("bookdb", ofType: "sql")! 

     do 
     { 
      try fileManager.copyItemAtPath(defaultDBPath, toPath: writableDBPath) 
     } 
     catch let unknownError 
     { 
      print("Failed to create writable database file with unknown error: \(unknownError)") 
     } 
    } 
} 
+0

¿Puede agradar a la página desde donde obtiene el código? Gracias. – itsaboutcode

+0

¿Dónde debería estar la base de datos si desea escribir en ella? Sé que si está en el grupo de Resourses (Main Bundle) es de solo lectura, entonces, ¿cuál es la forma correcta de permitir tanto la escritura como la lectura? ¡Gracias! –

+0

Sé que esto es un poco tarde, pero ¿cómo voy a encontrar si es necesario actualizarlo desde el paquete principal? Traté de verificar los atributos del archivo, pero la fecha de modificación del archivo en la aplicación cambia cada vez que compilo una nueva versión. – Flipper

6

Si sólo vas a ser la consulta de los datos, deberías poder dejarlo en el paquete principal.

Esto, sin embargo, probablemente no sea una buena práctica. Si tuviera que extender su aplicación en el futuro para permitir la escritura de la base de datos, tendría que resolver todo de nuevo ...

+3

@ Willi No necesariamente cierto. Si fuera a extender su aplicación en el futuro, siempre podría agregar la funcionalidad anterior en una actualización. Debería funcionar sin problemas. –

Cuestiones relacionadas