2011-04-12 17 views
7

no puedo encontrar una descripción clara de estos pasos en documentos de Apple ...almacén de núcleo Los datos incluidos en la aplicación Bundle

  1. Tengo un xcdatamodeld en mi proyecto Xcode
  2. A la hora del lanzamiento, mi aplicación analiza un XML (recursos del proyecto) para llenar el almacén de datos subyacente (SQLLite)
  3. Durante la vida de mi aplicación, puedo añadir, eliminar, actualizar los datos de esa tienda

Ahora, quiero dejar de hacer eso pesada Proceso de análisis XML en el dispositivo y directo Incluya una Tienda que contiene los datos requeridos.

Tengo algunas preguntas con respecto a este:

  • ¿Puedo llenar una tienda con una aplicación OS X y luego incluir esta tienda en mi proyecto XCode-IO?
  • Mi tienda no aparece en Xcode. De hecho, se crea en tiempo de ejecución. ¿Cómo puedo agregar una tienda en el proyecto y vincularla a mi xcdatamodeld?
  • He leído que al hacerlo evitaré que mi tienda se pueda escribir ... Creo que tengo que copiarlo en el lugar correcto en el momento del lanzamiento (el Tutorial de la utilidad Core Data es de gran ayuda para eso). ¿Estoy en lo cierto?

Gracias por sus sugerencias. URL u otras preguntas SO serían realmente apreciadas!

Kheraud

Respuesta

14

Usted puede incluir el archivo de almacén (sqlite db mayor parte del tiempo) en su aplicación. Luego, en su aplicación de edición delegado del captador merhod persistentStoreCoordinator:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator_ != nil) { 
     return persistentStoreCoordinator_; 
    } 

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataStore.sqlite"]; 

    // Check if the store exists in. 
    if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) { 
     // copy the payload to the store location. 
     NSString *bundleStore = [[NSBundle mainBundle] pathForResource:@"YourPayload" ofType:@"sqlite"]; 

     NSError *error = nil; 
     [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:&error]; 

     if (error){ 
      NSLog(@"Error copying payload: %@", error); 
     } 
    } 

    NSError *error = nil; 
    NSURL *storeURL = [NSURL fileURLWithPath:storePath]; 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return persistentStoreCoordinator_; 
} 
+0

Gracias por el trozo de código. ¿No crees que podría haber problemas de compatibilidad entre el dispositivo/Core Data/DB copiado? – iwalktheline

+0

No, la mayoría de las veces creo el archivo db con el simulador y luego lo uso en el dispositivo, no hay problema. – rckoenes

+0

En la segunda oración de su respuesta, ¿qué es ** persantstore **? (¿Error tipográfico?) – David

6

Lo que está haciendo actualmente (poblando al primer lanzamiento) es el camino "recomendada" de poblar un almacén de datos básicos. Aunque es un poco hacker, podría sin embargo sembrar la base de datos en el dispositivo de la siguiente manera:

  1. poner en marcha su aplicación en el simulador
  2. hacer lo que tiene que hacer para la aplicación del simulador para rellenar el almacén de datos básicos
  3. detención de la aplicación del simulador
  4. Vaya a la carpeta Documentos simulada (algo así como ~/Library/Application Support/iPhone Simulator/4.3/Applications/335567A0-760D-48AF-BC05-7F0D9BD085B6/<app-name>.app/)
  5. Encuentra la base de datos SQLite (que tiene el nombre que le dio al inicializar la base de datos)
  6. Co conecte esta base de datos a su proyecto y añádala para copiarla como recurso
  7. Agregue un código a su método application:didFinishLaunchingWithOptions: para que en el primer lanzamiento copie la base de datos del directorio de recursos de solo lectura al directorio de documentos de la aplicación. Por supuesto, debe hacer esto antes de inicializando Core Data.

Dependiendo de lo que almacena exactamente en su base de datos, sin embargo, puede descubrir problemas de gran tamaño, poco endiancia u otras incompatibilidades.Para hacer que el enfoque sea un poco más seguro, puedes volcar la base de datos del simulador (splite3 databasefile .dump >dumpfile) en tu Mac, luego incluir el archivo de volcado en tu proyecto (como se muestra arriba) y sorber el volcado de tu aplicación en el primer lanzamiento (leyéndolo línea a línea) línea y entrega de las sentencias sql a la API sqlite).

+0

Ok. Parece que usar SQL dump y parse + fill es una buena forma. Pero lidiar con XML no es mucho más complicado (creo). Además, recibo datos XML a través de la red y necesito analizarlos. Mantendré mi mecánica de XML como está ... Gracias por la ayuda, podría usarla más adelante :) – iwalktheline

10
  1. Escriba una aplicación de utilidad utilizando el modelo de datos y las clases para la aplicación. Use la aplicación de utilidad para generar una tienda persistente a partir de los datos proporcionados por el XML.
  2. Agregue el archivo de tienda al paquete de la aplicación como cualquier otro recurso
  3. Elija una ubicación en el directorio de la aplicación donde desea que resida el almacén activo, p. el directorio de la biblioteca.
  4. Tras el lanzamiento, compruebe si la tienda está presente en el directorio. Si no es así, la aplicación debe copiar la tienda desde el paquete de la aplicación al directorio utilizando los métodos estándar de NSFileManger como cualquier otro archivo. (Por lo general, solo necesita hacer esto la primera vez que se crea la tienda.)

Eso es todo lo que realmente hay que hacer.

+2

¿Está bien si conservo el archivo sqlite en Bundle, porque es de solo lectura? – onmyway133

+0

Core Data querrá encontrar los archivos sqlite en el directorio de soporte de aplicaciones de la aplicación: 'try FileManager.default.url (for: .applicationSupportDirectory, \t \t \t en: .userDomainMask, appropriateFor: nil, create: false)' es una forma de obtener esto. Sin embargo, está bien guardar una COPIA del archivo (s) en el paquete para copiar al soporte de la aplicación si está precargando la base de datos. - Ups, este es Swift, por supuesto, ya que es un par de años más tarde ;-) – leanne

Cuestiones relacionadas