2011-02-17 19 views
5

Quiero agregar una base de datos sqlite a XCode 4 (también se aplica a XCode 3). Los tutoriales indican que se debe agregar el archivo .db a la carpeta de recursos, y supongo que esto se copia a ~/Library/Application Support/iPhone Simulator/4.2/Applications/{some-id}/Documents/ durante la compilación donde puede encontrar el archivo con NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) etc.¿Cómo agrego archivos a la carpeta de recursos en XCode?

Sin embargo, XCode 4 no tiene una carpeta de recursos visible.

He intentado agregar un archivo con el comando Agregar archivo ... y luego aparece en Destinos> Nombre de la aplicación> Copiar recursos del paquete, pero siempre aparece un archivo .db vacío en la carpeta de documentos anterior (que luego reemplazar manualmente - obviamente no es el enfoque correcto)

(debido a la naturaleza de los datos que estoy pegando con SQLite sobre CoreData)

Respuesta

11

usted tiene que empezar a añadir su base de datos en su proyecto Xcode, por lo que se agregará en la carpeta del paquete, donde puede encontrarlo a través del código:

[NSBundle mainBundle] 

Es la única carpeta donde puede agregar archivos a través de xcode al "compilar" su aplicación (eventualmente con subcarpetas, pero no con carpetas del "sistema" como "documentos") ahora solo debe tener en cuenta que la carpeta del paquete principal es solo "solo lectura", por lo que no puede utilizar su base de datos allí con privilegios de escritura. Así que la forma normal es:

1) cuando desee utilizar su base de datos, verifique mediante el código si existe en la carpeta de la aplicación: documentos. Por supuesto, la primera vez no lo hace, por lo

2) copiarlo del haz principal

- (BOOL)transferDb { 
    NSError **error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourData.db"]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    if (![fileManager fileExistsAtPath: path]) 
    { 
     NSString *bundle = [[ NSBundle mainBundle] pathForResource:@"preferenze" ofType:@"plist"]; 
     [fileManager copyItemAtPath:bundle toPath:path error:error]; 
     return YES; 
    } 
    return NO; 
} 

3) utilizarla (r/w) en los documentos de la carpeta

ps: y (por supuesto) tenga en cuenta que cuando utiliza/edita/escribe db en iPhone/simulator, tal vez agregue registros, el del paquete principal y, por supuesto, el de su mac/proyecto no se actualizará, no se le agregarán registros, por lo que si por algún motivo elimina su aplicación en iPhone/simulador (o "limpia todos los destinos" mediante el menú "compilación" de xCode), el método de verificación/copia copie el db "virgen" nuevamente en la carpeta de documentos, para que pierda todos sus cambios ...

+1

me gustaría simplemente preguntar si el código sigue siendo válida para iOS 8 y Yosemite como la ubicación de los archivos de SQLite ha cambiado –

2

Tenga cuidado con la cantidad de datos que está colocando en la carpeta Documentos, esto es para los datos del usuario y ya que los datos se respaldarán con iCloud Apple ha limitado la cantidad de datos que una aplicación puede almacenar y usar en la carpeta Documentos.

Mi aplicación fue rechazada por usar una base de datos SQLite de 6MB de esta manera. En su lugar, cópielo en el directorio de cachés: NSCachesDirectory.

o impedir que el archivo se copia de seguridad: https://developer.apple.com/library/ios/#qa/qa1719/_index.html

Cuestiones relacionadas