Me gustaría agregar datos básicos a un proyecto de iPhone existente, pero aún recibo muchos errores de compilación:
- NSManagedObjectContext undeclared
- Expected specifier-qualifier-list before 'NSManagedObjectModel'
- ...
Ya agregué el Core Data Framework al destino (haga clic derecho en mi proyecto en "Objetivos", "Agregar" - "Marcos existentes", "CoreData.framework").
Mi archivo de encabezado:
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
[...]
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
¿Qué me estoy perdiendo? Comenzar un nuevo proyecto no es una opción ...
¡Muchas gracias!
editar lo
siento, tengo esas implementaciones ... pero parece que falta la Biblioteca ... los métodos de implementación están llenos con un error de compilación como " managedObjectContext undeclared
", " NSPersistentStoreCoordinator undeclared
", pero también con "Esperado ')' antes NSManagedObjectContext
" (aunque parece que los paréntesis son correctos) ...
#pragma mark -
#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 by merging all of the models found in
application bundle.
*/
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
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 = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
stringByAppendingPathComponent: @"Core_Data.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. If it is not possible to recover from the error, display an alert panel that
instructs the user to quit the application by pressing the Home button.
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.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator;
}
Solo para exponer todos los pasos que realmente necesita realizar para agregar Core Data a un proyecto que anteriormente no lo tenía:
Paso 1: agregue el marco
Haga clic en el destino de su aplicación (en el panel izquierdo es el ícono superior con el nombre de su aplicación) luego vaya a la pestaña 'Crear fases' y luego en 'Vincular binario con bibliotecas', haga clic en el pequeño '+' en la parte inferior y luego busque 'CoreData.framework' y agréguelo a su proyecto
Luego, importa los datos coredata en todos los objetos que lo necesites (la forma no sexy) usando:
Rápido
C objetivo
o agregue la importación debajo de las importaciones comunes en su archivo .pch (mucho más sexy) de esta manera:
Paso 2: agregue el modelo de datos
Para agregar el archivo .xcdatamodel, haga clic con el botón derecho / control-clic en sus archivos en el panel derecho (como en una carpeta de Recursos para su custodia) y seleccione Agregar un archivo nuevo, haga clic en la pestaña Datos principales al seleccionar su tipo de archivo y luego haga clic en ' Modelo de datos ', asígnele un nombre y haga clic en Siguiente y Finalizar y lo agregará a su proyecto. Cuando haga clic en este objeto Modelo, verá la interfaz para agregar las Entidades a su proyecto con las relaciones que desee.
Paso 3: Actualizar delegado de aplicaciones
En Swift en AppDelegate.swift
En el objetivo C, asegúrese de agregar estos objetos a AppDelegate.h
Sintetice los objetos anteriores en AppDelegate.m así:
Luego agregue estos métodos a AppDelegate.m (asegúrese de poner el nombre del modelo que agregó en los puntos que se muestran):
Paso 4: Lleve los objetos de datos a ViewControllers donde necesita los datos
Opción 1. Use el ManagedObjectContext del delegado de la aplicación de VC (preferido y más fácil)
Según lo sugerido por @ brass-kazoo: recupere una referencia a AppDelegate y su managedObjectContext a través de:
Rápido
C objetivo
en su ViewController
Opción 2. Cree ManagedObjectContext en su VC y haga que coincida con AppDelegate's de AppDelegate (Original)
Solo se muestra la versión anterior para el Objetivo C, ya que es mucho más fácil usar el método preferido
en el ViewController.h
En el ViewController.m
En AppDelegate, o la clase en la que se crea ViewController, configure el managedObjectContext para que sea igual al AppDelegate
Si desea que el viewcontroller que usa Core Data sea un FetchedResultsController, entonces deberá asegurarse de que esto esté en su ViewController.h
Y esto está en ViewController.m
Después de todo eso, ahora puede usar este managedObjectContext para ejecutar todas las solicitudes de búsqueda habituales necesarias para la bondad de CoreData. Disfrutar
fuente
[[UIApplication sharedApplication] delegate]
y luego el contexto vía[appDelegate managedObjectContext]
Para Swift 3: INCLUYE DATOS DE AHORRO Y RECUPERACIÓN
Paso 1 : agregar marco
Paso 2: Agregar modelo de datos
Archivo> Nuevo> Archivo> Datos principales> Modelo de datos
SampleData
el archivo resultante seríaSampleData.xcdatamocelId
Paso 3: Agregue las siguientes funciones a su Delegado de aplicaciones y agregue "importar CoreData" al principio
PASO 4: Agregar entidad y atributo al modelo
a) Agregar entidad
b) Agregar atributo
PASO 5: Guardar datos
PASO 5: Recuperando Datos
fuente
Intente crear la aplicación Cocoa respaldada por Core Data y mire AppDelegate. Verá los métodos de implementación de la pila de datos centrales allí, así como el archivo de modelo de objeto administrado para definir sus entidades y otras cosas relacionadas con los datos centrales.
Nos ha mostrado solo el encabezado (es decir, la declaración), pero no la implementación (es decir, la definición) de la pila de datos básicos.
fuente
Si te encuentras con este mismo problema en xcode 4, como lo hice yo. Es diferente: tuve que seleccionar el proyecto, luego en los objetivos expandir "Enlace binario con bibliotecas" que muestra las bibliotecas actuales. Desde allí, haga clic en el signo + (signo más) para seleccionar cualquier biblioteca adicional que necesite. Lo puse en la parte superior del proyecto y tuve que moverlo (arrastrar y soltar) al Grupo Frameworks , pero eso fue todo.
fuente
Como Eimantas declaró que falta la implementación de la pila de núcleo, como
Una solución sería crear un nuevo proyecto de controlador de datos centrales y copiar / pegar la implementación en su proyecto.
fuente
Para Swift 3:
Archivo-> archivo nuevo-> CoreData-> Modelo para crear un modelo.
Consulte este enlace para obtener más información sobre cómo implementarlo.
fuente
// en Swift 2.2, puede hacer lo siguiente sin cambiar el archivo AppDelegate.
File-> new file-> ios-> cocoa Touch class -> establece su subclase como NSObject-> nómbralo como DataController.swift Dentro del archivo incluye ///
import UIKit import CoreData class DataController: NSObject {
}
//////
/////// seed () -> def
// fetch () def
fuente
view.h
detalle.h
fuente
.h
fuente
fuente
fuente
vista de codificación de muestra1
vista de detalle de muestra
botón guardar
fuente