2009-10-06 21 views
9

He creado una aplicación de utilidad que está casi completa, pero ahora estoy en un punto donde realmente tengo que persistir Datos.Cómo agregar datos principales a una aplicación de utilidad existente

Dado que XCode proporciona solo plantillas de datos centrales en una aplicación basada en navegación o en la ventana, ¿hay alguna manera fácil de agregar datos principales a mi aplicación? Nunca he trabajado con Core Data y solo tengo que persistir mensajes con 460 caracteres y un nombre de contacto como historia de envío de mensajes.

¿O debería comenzar con una nueva aplicación basada en la ventana incl. Core Data e intenta construir la Parte de Utilidad/Flipside a mano?

¿Alguien me puede recomendar las mejores prácticas para mi situación?

Respuesta

9

Tendrá que agregar la infraestructura CoreData a su destino, crear un modelo de datos y crear instancias de los objetos NSManagedObjectModel, NSPersistentStoreCoordinator y NSManagedObjectContext.

Adición de datos básicos de una aplicación existente se discute brevemente en this Apple document (búsqueda de "aplicación existente")

También debería visualizar la Manzana tutorial a tener una idea de lo que se trata.

Siempre puede considerar usar SQLite también.

+2

Estoy de acuerdo con la idea de usar SQLite lugar. Core Data es bastante resistente y dado que parece que no hay muchos datos o relaciones complejas que persistan aquí, SQLite podría ser la forma menos compleja y más eficiente de hacerlo. –

+3

Core Data es más fácil, una vez que comprenda cómo funciona, esto es especialmente cierto para proyectos pequeños. –

+4

Yo votaría en contra de rodar tu propio código directamente contra SQLite. Todos esos códigos que he visto acaban de volver a implementar partes de Core Data, pero de una manera incorrecta y aún menos preferida. Core Data es el camino, especialmente cuando se agregan enlaces a Cocoa Touch en el camino. – PeyloW

6

Cree un nuevo proyecto en XCode, utilizando las plantillas proporcionadas; encuentre uno que tenga un recuadro para verificar si utiliza Core Data para el almacenamiento.

Eso le da un archivo xcdatamodel, y algunas variables de código/clase en la aplicación delegan que puede copiar desde ese proyecto al actual.

También recomiendo el tutorial de Apple mencionado por nall.

Si decide utilizar SQLLite directamente en su lugar, considere utilizar FMDB, lo que simplifica el código SQL. Es un archivo que agregas a un proyecto.

+0

Recomiendo también FMDB si va a utilizar SQLite. –

18

Como también estoy tratando de entender la twighlightzone de datos básicos, calculé los siguientes pasos para migrar un proyecto 'normal' a datos centrales (comparando un proyecto de aplicación vacío con un proyecto de aplicación vacío con datos básicos)

Paso 1: Añadir CoreData.framework

a) En "Resumen del Proyecto Objetivo" en "marcos y bibliotecas vinculados" añadir el CoreData.framework con el botón +
b) Seleccione Archivo/Nuevo/Archivo y en la sección 'Datos principales' agregue un nuevo 'Modelo de datos' (y llámelo, es decir, XXXXXXX (para la denominación consulte 3.b)
c) En el archivo APLICACIÓN-Prefijo. PCH (donde la aplicación es el nombre del proyecto) añadir el

#import <CoreData/CoreData.h> 

bajo los otros dos directivas incluyen

Paso 2: En el AppDelegate.h añadir las siguientes propiedades/método declaraciones:

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; 
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; 

- (void)saveContext; 
- (NSURL *)applicationDocumentsDirectory; 

Paso 3: AppDelegate.m

a) Syntesize las propiedades:

@synthesize managedObjectContext = __managedObjectContext; 
@synthesize managedObjectModel = __managedObjectModel; 
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator; 

b) al final del módulo agregue las siguientes líneas:

Importante: En la Methode managedObjectModel y persistentStoreCoordinator usted tiene que reemplazar el XXXXXXX withe el nombre de su archivo personal .xcdatamodeld

- (void)saveContext 
{ 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) 
    { 
     if ([managedObjectContext hasChanges] & ![managedObjectContext save:&error]) 
     { 
      /* 
      Replace this implementation with code to handle the error appropriately. 

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      */ 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 
} 

#pragma mark - Core Data stack 

/** 
Returns the managed object context for the application. 
If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. 
*/ 
- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (__managedObjectContext != nil) 
    { 
     return __managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) 
    { 
     __managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [__managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return __managedObjectContext; 
} 

/** 
Returns the managed object model for the application. 
If the model doesn't already exist, it is created from the application's model. 
*/ 
- (NSManagedObjectModel *)managedObjectModel 
{ 
    if (__managedObjectModel != nil) 
    { 
     return __managedObjectModel; 
    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"XXXXXXX" withExtension:@"momd"]; 
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
    return __managedObjectModel; 
} 

/** 
Returns the persistent store coordinator for the application. 
If the coordinator doesn't already exist, it is created and the application's store added to it. 
*/ 
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (__persistentStoreCoordinator != nil) 
    { 
     return __persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"XXXXXXX.sqlite"]; 

    NSError *error = nil; 
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) 
    { 
     /* 
     Replace this implementation with code to handle the error appropriately. 

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

     Typical reasons for an error here include: 
     * The persistent store is not accessible; 
     * The schema for the persistent store is incompatible with current managed object model. 
     Check the error message to determine what the actual problem was. 


     If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory. 

     If you encounter schema incompatibility errors during development, you can reduce their frequency by: 
     * Simply deleting the existing store: 
     [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil] 

     * Performing automatic lightweight migration by passing the following dictionary as the options parameter: 
     [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

     Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details. 

     */ 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return __persistentStoreCoordinator; 
} 

#pragma mark - Application's Documents directory 

/** 
Returns the URL to the application's Documents directory. 
*/ 
- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 
+0

¿cómo el contexto administrado sería consciente del modelo? ¿automáticamente? – fengd

+0

@ Jun1st: cambiar el nombre de los archivos sqlite y momd al mismo que el modelo xcdata es cómo este ejemplo vincula el contexto con el modelo – ColdLogic

Cuestiones relacionadas