ios - objective - read core data swift
Agregando datos básicos a un proyecto de iPhone existente (13)
codigo de muestra view1
#import "ViewController.h"
#import "DetailViewController.h"
@interface ViewController ()
{
NSInteger indexPathvalue;
}
@end
@implementation ViewController
- (NSManagedObjectContext *)managedObjectContext {
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"call this one2");
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSManagedObjectContext *managedObjectContext = [self
managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]
initWithEntityName:@"Details"];
self.dataList = [[managedObjectContext executeFetchRequest:fetchRequest
error:nil] mutableCopy];
[_coreDataList reloadData];
NSLog(@"call this one");
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:
(NSInteger)section
{
return self.dataList.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell
alloc]initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:CellIdentifier];
}
NSManagedObject *user = [self.dataList objectAtIndex:indexPath.row];
cell.textLabel.text = [user valueForKey:@"name"];
cell.detailTextLabel.text = [user valueForKey:@"mobileNumber"];
cell.imageView.image = [UIImage imageWithData:[user
valueForKey:@"imageView"]];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
(NSIndexPath *)indexPath
{
indexPathvalue = indexPath.row;
[self performSegueWithIdentifier:@"detailView" sender:self];
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:
(NSIndexPath *)indexPath
{
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:
(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:
(NSIndexPath *)indexPath
{
NSManagedObjectContext *context = [self managedObjectContext];
if (editingStyle == UITableViewCellEditingStyleDelete)
{
[context deleteObject:[self.dataList objectAtIndex:indexPath.row]];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Can''t Delete! %@ %@", error, [error localizedDescription]);
return;
}
[self.dataList removeObjectAtIndex:indexPath.row];
[_coreDataList reloadData];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)addBtnClick:(id)sender {
}
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
if ([segue.identifier isEqualToString:@"detailView"])
{
NSManagedObject *obj = [self.dataList objectAtIndex:indexPathvalue];
DetailViewController *detail = segue.destinationViewController;
detail.userData = obj;
}
}
@end
vista detallada de la muestra
#import "DetailViewController.h"
@interface DetailViewController ()
@end
@implementation DetailViewController
- (NSManagedObjectContext *)managedObjectContext {
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
if (self.userData) {
[self.nameTxt setText:[self.userData valueForKey:@"name"]];
[self.mobileTxt setText:[self.userData valueForKey:@"mobileNumber"]];
[self.emailIdTxt setText:[self.userData valueForKey:@"email"]];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
/*
botón de guardar
- (IBAction)saveBtnClick:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];
if (self.userData) {
// Update existing data
[self.userData setValue:self.nameTxt.text forKey:@"name"];
[self.userData setValue:self.mobileTxt.text forKey:@"mobileNumber"];
[self.userData setValue:self.emailIdTxt.text forKey:@"email"];
UIImage *sampleimage = [UIImage imageNamed:@"icon.png"];
NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0);
[self.userData setValue:dataImage forKey:@"imageView"];
} else {
// Create a new data
NSManagedObject *newDevice = [NSEntityDescription
insertNewObjectForEntityForName:@"Details"
inManagedObjectContext:context];
[newDevice setValue:self.nameTxt.text forKey:@"name"];
[newDevice setValue:self.mobileTxt.text forKey:@"mobileNumber"];
[newDevice setValue:self.emailIdTxt.text forKey:@"email"];
UIImage *sampleimage = [UIImage imageNamed:@"icon.png"];
NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0);
[newDevice setValue:dataImage forKey:@"imageView"];
}
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can''t Save! %@ %@", error, [error localizedDescription]);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
Me gustaría agregar datos básicos a un proyecto de iPhone existente, pero aún tengo muchos errores de compilación:
- NSManagedObjectContext undeclared
- Expected specifier-qualifier-list before ''NSManagedObjectModel''
- ...
Ya agregué Core Data Framework al objetivo (haga clic con el botón derecho en mi proyecto en "Objetivos", "Agregar" - "Marcos existentes", "CoreData.framework").
Mi archivo de cabecera:
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? Iniciar un nuevo proyecto no es una opción ...
¡Muchas gracias!
Lo siento, tengo esas implementaciones ... pero parece que falta la Biblioteca ... los métodos de implementación están llenos de errores de compilación como " managedObjectContext undeclared
", " NSPersistentStoreCoordinator undeclared
", pero también con "Expected '')'' 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;
}
// en Swift 2.2, puede hacer lo siguiente sin cambiar el archivo AppDelegate.
- Proyecto-> destinos -> marcos y bibliotecas vinculados Ahora agregue un nuevo marco (haga clic en +) ''CoreData''
- Archivo-> nuevo archivo-> CoreData-> DataModel nombre como, por ejemplo, A.xcdatamodelid
- En A.xcdatamodelid, cree una nueva entidad (haga clic en entidad +), asígnele el nombre como Bc y establezca su clase como ''Bc'' en la ventana del inspector a la derecha.
- Ahora agregue atributos a la entidad (haga clic en los atributos +), agregue un atributo para, por ejemplo: nombre y su tipo como Cadena.
- Ahora editor-> crear NSManagedObject Subclass -> haga clic en siguiente en la ventana emergente -> nuevamente en siguiente -> luego haga clic en crear. Se crearán dos nuevos archivos 1. una nueva clase llamada Bc.swift y una extensión llamada Bc + coredataproperties.swift.
Archivo-> nuevo archivo-> ios-> cocoa Clase táctil -> establezca su subclase como NSObject-> asígnele el nombre como DataController.swift Dentro del archivo incluya ///
importar UIKit importar CoreData clase DataController: NSObject {
var managedObjectContext: NSManagedObjectContext override init() { // This resource is the same name as your xcdatamodeld contained in your project. guard let modelURL = NSBundle.mainBundle().URLForResource("A", withExtension:"momd") else { fatalError("Error loading model from bundle") } // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model. guard let mom = NSManagedObjectModel(contentsOfURL: modelURL) else { fatalError("Error initializing mom from: /(modelURL)") } let psc = NSPersistentStoreCoordinator(managedObjectModel: mom) self.managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) self.managedObjectContext.persistentStoreCoordinator = psc let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) let docURL = urls[urls.endIndex-1] /* The directory the application uses to store the Core Data store file. This code uses a file named "A.sqlite" in the application''s documents directory. */ let storeURL = docURL.URLByAppendingPathComponent("A.sqlite") do { try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil) } catch { fatalError("Error migrating store: /(error)") } }
}
//////
- Ahora dentro del archivo viewcontroller puede acceder a su base de datos utilizando dos métodos. Importante: incluya la declaración en su viewController "importar CoreData" a. llame a seed () -> para insertar valor en db / entity b. llamar a fetch () -> para recuperar el valor de db / entity
/////// semilla () -> def
func seedPerson() {
// create an instance of our managedObjectContext
let moc = DataController().managedObjectContext
// we set up our entity by selecting the entity and context that we''re targeting
let entity = NSEntityDescription.insertNewObjectForEntityForName("Bc", inManagedObjectContext: moc) as! Bc
// add our data
entity.setValue("Meera", forKey: "name")
// we save our entity
do {
try moc.save()
} catch {
fatalError("Failure to save context: /(error)")
}
}
// fetch () def
func fetch() {
let moc = DataController().managedObjectContext
let personFetch = NSFetchRequest(entityName: "Bc")
do {
let fetchedPerson = try moc.executeFetchRequest(personFetch) as! [Bc]
print(fetchedPerson.first!.name!)
} catch {
fatalError("Failed to fetch person: /(error)")
}
}
Como Eimantas declaró que te perdiste la implementación del Core Stack, como
- (NSManagedObjectContext *) managedObjectContext;
- (NSManagedObjectModel *)managedObjectMode;
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
La solución sería crear un nuevo proyecto de controlador de datos principales y copiar / pegar la implementación en su proyecto.
Intente crear la aplicación Cocoa respaldada por Core Data y observe AppDelegate. Verá los métodos de implementación de la pila de datos principales allí, así como el archivo de modelo de objeto administrado para definir sus entidades y otras cosas relacionadas con los datos principales.
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 principales.
Si te encuentras con este mismo problema en xcode 4, como lo hice. Es diferente: tuve que seleccionar el proyecto, luego en los destinos expandir "Vincular binarios con bibliotecas", que muestra las bibliotecas actuales. Desde allí, haga clic en el signo + (signo más) para seleccionar las bibliotecas adicionales que necesite. Lo coloqué en la parte superior del proyecto y tuve que moverlo (arrastrar y soltar) al Grupo de Frameworks , pero eso fue todo.
Solo para exponer todos los pasos que realmente necesita realizar para agregar Datos básicos a un proyecto que anteriormente no lo tenía:
Paso 1: Añadir el marco
Haga clic en el objetivo de su aplicación (en el panel izquierdo se encuentra el ícono superior con el nombre de su aplicación), luego vaya a la pestaña "Fases de creación" y luego en "Vincular binarios con bibliotecas", haga clic en el pequeño ''+'' en la parte inferior y luego busque ''CoreData.framework'' y agrégalo a tu proyecto
Luego, puede importar coredata en todos los objetos que lo necesite (la forma no sexy) usando:
Rápido
import CoreData
C objetivo
#import <CoreData/CoreData.h>
o agrega la importación debajo de las importaciones comunes en tu archivo .pch (mucho más sexy) de esta manera:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
Paso 2: Agregar el modelo de datos
Para agregar el archivo .xcdatamodel, haga clic con el botón derecho del mouse / control-clic en sus archivos en el panel derecho (como en una carpeta de Recursos para el mantenimiento seguro) y seleccione Agregar un nuevo archivo, haga clic en la pestaña Datos centrales cuando seleccione 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 el delegado de la aplicación
En Swift en AppDelegate.swift
//replace the previous version of applicationWillTerminate with this
func applicationWillTerminate(application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
// Saves changes in the application''s managed object context before the application terminates.
self.saveContext()
}
func saveContext () {
var error: NSError? = nil
let 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.
//println("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.
var managedObjectContext: NSManagedObjectContext {
if !_managedObjectContext {
let coordinator = self.persistentStoreCoordinator
if coordinator != nil {
_managedObjectContext = NSManagedObjectContext()
_managedObjectContext!.persistentStoreCoordinator = coordinator
}
}
return _managedObjectContext!
}
var _managedObjectContext: NSManagedObjectContext? = nil
// Returns the managed object model for the application.
// If the model doesn''t already exist, it is created from the application''s model.
var managedObjectModel: NSManagedObjectModel {
if !_managedObjectModel {
let modelURL = NSBundle.mainBundle().URLForResource("iOSSwiftOpenGLCamera", withExtension: "momd")
_managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)
}
return _managedObjectModel!
}
var _managedObjectModel: NSManagedObjectModel? = nil
// 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.
var persistentStoreCoordinator: NSPersistentStoreCoordinator {
if !_persistentStoreCoordinator {
let storeURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("iOSSwiftOpenGLCamera.sqlite")
var error: NSError? = nil
_persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
if _persistentStoreCoordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) == nil {
/*
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:
[NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true}
Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.
*/
//println("Unresolved error /(error), /(error.userInfo)")
abort()
}
}
return _persistentStoreCoordinator!
}
var _persistentStoreCoordinator: NSPersistentStoreCoordinator? = nil
// #pragma mark - Application''s Documents directory
// Returns the URL to the application''s Documents directory.
var applicationDocumentsDirectory: NSURL {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.endIndex-1] as NSURL
}
En Objective C, asegúrese de agregar estos objetos a AppDelegate.h
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (NSURL *)applicationDocumentsDirectory; // nice to have to reference files for core data
Sintetice los objetos anteriores en AppDelegate.m de esta manera:
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
Luego agregue estos métodos a AppDelegate.m (asegúrese de poner el nombre del modelo que agregó en los lugares que se muestran):
- (void)saveContext{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
- (NSManagedObjectContext *)managedObjectContext{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAMEOFYOURMODELHERE" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"NAMEOFYOURMODELHERE.sqlite"];
NSError *error = nil;
_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;
}
#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];
}
Paso 4: Lleve los objetos de datos a los ViewControllers donde necesita los datos
Opción 1. Utilice 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 administradoObjectContext a través de:
Rápido
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.managedObjectContext
C objetivo
[[[UIApplication sharedApplication] delegate] managedObjectContext];
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 antigua de Objective C ya que es mucho más fácil usar el método preferido
en el ViewController.h
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
En el ViewController.m
@synthesize managedObjectContext = _managedObjectContext;
En el AppDelegate, o la clase donde se crea el ViewController, establezca el managedObjectContext para que sea el mismo que el AppDelegate
ViewController.managedObjectContext = self.managedObjectContext;
Si desea que el controlador de vista que usa los Datos del Núcleo sea un controlador FetchedResults, entonces deberá asegurarse de que esta información esté en su ViewController.h
@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
Y esto está en ViewController.m
@synthesize fetchedResultsController, managedObjectContext;
Después de todo eso, ahora puedes usar este managedObjectContext para ejecutar todas las solicitudes de búsqueda habituales necesarias para la bondad de CoreData. Disfrutar
Todos los archivos de encabezado CoreData se importan en App_Prefix.pch
, por lo que las clases CoreData estarán disponibles en todo su Proyecto, por lo que no tiene que importar manualmente el encabezado en los archivos que necesita.
Así que abra Xcode y busque algún archivo como App_Prefix.pch
, por defecto está en el grupo Other Sources
. Después de la declaración de importación UIKit
, agregue la siguiente línea:
#import <CoreData/CoreData.h>
Y deberías estar listo para irte.
Xcode 4
Para proyectos creados en Xcode 4, el archivo de prefijo se puede encontrar en el grupo Supporting Files
en el navegador de proyectos. Se llama '' projectname -Prefix.pch'' por defecto.
Xcode 6+
A partir de Xcode 6, el archivo de encabezado precompilado ya no se incluye de forma predeterminada. Esto se debe a la introducción de los módulos, que eliminan la necesidad de utilizar encabezados precompilados. Si bien aún es posible agregar manualmente un archivo PCH para incluir globalmente los encabezados CoreData, considere la posibilidad de especificar la dependencia CoreData usando @import CoreData;
* en cada archivo que utiliza CoreData. Esto hace que las dependencias sean explícitas y, lo que es más importante, evitará el problema de esta pregunta en el futuro.
* Los módulos deben estar habilitados para que esto funcione.
ver.h
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface ViewController :
UIViewController<UITableViewDataSource,UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *coreDataList;
- (IBAction)addBtnClick:(id)sender;
@property (strong, nonatomic) NSMutableArray *dataList;
@end
detalle.h
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface DetailViewController : UIViewController<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *nameTxt;
@property (weak, nonatomic) IBOutlet UITextField *mobileTxt;
@property (weak, nonatomic) IBOutlet UITextField *emailIdTxt;
- (IBAction)saveBtnClick:(id)sender;
@property (strong,nonatomic) NSManagedObject *userData;
@end
Para Swift 3: INCLUYE DATOS DE AHORRO Y RECUPERACIÓN
Paso 1 : Añadir marco
Paso 2: Agregar modelo de datos
Archivo> Nuevo> Archivo> Datos básicos> Modelo de datos
- Nombre el archivo como
SampleData
el archivo resultante seríaSampleData.xcdatamocelId
Paso 3: agregue las siguientes funciones a su delegado de aplicación y agregue "importar CoreData" a la parte superior
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
// Saves changes in the application''s managed object context before the application terminates.
self.saveContext()
}
// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentContainer = {
/*
The persistent container for the application. This implementation
creates and returns a container, having loaded the store for the
application to it. This property is optional since there are legitimate
error conditions that could cause the creation of the store to fail.
*/
// SEE BELOW LINE OF CODE WHERE THE ''name'' IS SET AS THE FILE NAME (SampleData) FOR THE CONTAINER
let container = NSPersistentContainer(name: "SampleData")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
// Replace this implementation with code to handle the error appropriately.
// fatalError() 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 parent directory does not exist, cannot be created, or disallows writing.
* The persistent store is not accessible, due to permissions or data protection when the device is locked.
* The device is out of space.
* The store could not be migrated to the current model version.
Check the error message to determine what the actual problem was.
*/
fatalError("Unresolved error /(error), /(error.userInfo)")
}
})
return container
}()
// MARK: - Core Data Saving support
func saveContext () {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() 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.
let nserror = error as NSError
fatalError("Unresolved error /(nserror), /(nserror.userInfo)")
}
}
}
PASO 4: Agregar entidad y atributo al modelo
PASO 5: Guardar datos
func saveItem(itemToSave: String){
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
//**Note:** Here we are providing the entityName **`Entity`** that we have added in the model
let entity = NSEntityDescription.entity(forEntityName: "Entity", in: context)
let myItem = NSManagedObject(entity: entity!, insertInto: context)
myItem.setValue(itemToSave, forKey: "item")
do {
try context.save()
}
catch{
print("There was an error in saving data")
}
}
PASO 5: Recuperando datos
override func viewWillAppear(_ animated: Bool) {
// Obtaining data from model
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity")
do {
let results = try context.fetch(fetchRequest)
let obtainedResults = results as! [NSManagedObject]
let firstResult = obtainedResults[0]
let myValue = firstResult.value(forKey: "item")
print("myValue: /(myValue)")
} catch {
print("Error")
}
}
Para Swift 3:
Archivo-> nuevo archivo-> CoreData-> Modelo para crear un modelo.
Consulte este link para obtener más información sobre cómo implementarlo.
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
if (self.userData) {
[self.nameTxt setText:[self.userData valueForKey:@"name"]];
[self.mobileTxt setText:[self.userData
valueForKey:@"mobileNumber"]];
[self.emailIdTxt setText:[self.userData valueForKey:@"email"]];
[self.imgView setImage:[UIImage imageWithData:[self.userData
valueForKey:@"imageView"]]]; }
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
/*
#pragma mark - Navigation
- (IBAction)browseBtn:(id)sender
{
UIImagePickerController *imgpic =[[UIImagePickerController
alloc]init];
imgpic .delegate =self;
imgpic .sourceType =UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:imgpic animated:YES completion:nil];
}
-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
UIImage *choose = info[UIImagePickerControllerOriginalImage];
self.imgView.image=choose;
[picker dismissViewControllerAnimated:YES completion:nil];
}
- (IBAction)saveBtnClick:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];
if (self.userData) {
// Update existing data
[self.userData setValue:self.nameTxt.text forKey:@"name"];
[self.userData setValue:self.mobileTxt.text
forKey:@"mobileNumber"];
[self.userData setValue:self.emailIdTxt.text forKey:@"email"];
UIImage *sampleimage = _imgView.image;
NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0);
[self.userData setValue:dataImage forKey:@"imageView"];
} else {
// Create a new data
NSManagedObject *newDevice = [NSEntityDescription
insertNewObjectForEntityForName:@"Details"
inManagedObjectContext:context];
[newDevice setValue:self.nameTxt.text forKey:@"name"];
[newDevice setValue:self.mobileTxt.text forKey:@"mobileNumber"];
[newDevice setValue:self.emailIdTxt.text forKey:@"email"];
UIImage *sampleimage = _imgView.image;
NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0);
[newDevice setValue:dataImage forKey:@"imageView"];
}
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can''t Save! %@ %@", error, [error localizedDescription]);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
.h
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface DetailViewController :
UIViewController<UITextFieldDelegate,UINavigationControllerDelegate,
UIIma
gePickerControllerDelegate>
@property (weak, nonatomic) IBOutlet UITextField *nameTxt;
@property (weak, nonatomic) IBOutlet UITextField *mobileTxt;
@property (weak, nonatomic) IBOutlet UITextField *emailIdTxt;
@property (weak, nonatomic) IBOutlet UIImageView *imgView;
- (IBAction)browseBtn:(id)sender;
- (IBAction)saveBtnClick:(id)sender;
@property (strong,nonatomic) NSManagedObject *userData;
@end
let alert = UIAlertController(title:"Error", message: "No Internet Connection", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in}))
alert.addAction(UIAlertAction(title: "Try Again", style: .default, handler: { (action) in
self.networkCall(text: self.daySelected)
}))
self.present(alert, animated: false, completion: nil)
+(void) insetPlusUpdate:(NSDictionary *)dataa {
NSManagedObjectContext * context;
if (![[NSThread currentThread] isMainThread]) {
context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:[APP_DELEGATE persistentStoreCoordinator]];
} else {
context = [APP_DELEGATE managedObjectContext];
}
NSFetchRequest * request = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:context];
[request setEntity:entity];
NSPredicate * check = [NSPredicate predicateWithFormat:@"attribute == %@", Dict[@"key"]];
[request setPredicate:check];
NSError * error = nil;
if ([context countForFetchRequest:request error:&error] == 0) {
Entity.attribute = @"";
} else {
NSArray * array = [context executeFetchRequest:request error:&error];
EntityName * entity = [array firstObject];
Entity.attribute = @"";
}
}
+(NSString *)fetch:(NSString *)feed_id{
NSManagedObjectContext * context;
if(![[NSThread currentThread] isMainThread]){
context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:[APP_DELEGATE persistentStoreCoordinator]];
} else {
context = [APP_DELEGATE managedObjectContext];
}
NSFetchRequest * request = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"ENTITYNAME" inManagedObjectContext:context];
[request setEntity:entity];
NSPredicate * check = [NSPredicate predicateWithFormat:@"attribute == %@", Dict[@"key"]];
[request setPredicate:check];
NSError * error = nil;
if ([context countForFetchRequest:request error:&error] > 0) {
NSArray * array = [context executeFetchRequest:request error:&error];
ENTITYNAME * fetchData = [array firstObject];
NSString * string = fetchData.attribte[@"key"];
return string;
}
return nil;
}
+(BOOL)delete{
NSManagedObjectContext * context;
if (![[NSThread currentThread] isMainThread]) {
context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:[APP_DELEGATE persistentStoreCoordinator]];
} else {
context = [APP_DELEGATE managedObjectContext];
}
NSFetchRequest * request = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"ENTITYNAME" inManagedObjectContext:context];
[request setEntity:entity];
NSError *error = nil;
NSBatchDeleteRequest *deleteRequest = [[NSBatchDeleteRequest alloc] initWithFetchRequest: request];
@try{
[context executeRequest:deleteRequest error:&error];
if([context save:&error]){
NSLog(@"Deleted");
return [context save:&error];
}
else{
return [context save:&error];
}
}
@catch(NSException *exception){
NSLog(@"failed %@",exception);
return [context save:&error];
}
}