Добавление основных данных в существующий проект iPhone
Я хотел бы добавить основные данные в существующий проект iPhone, но я все еще получаю много ошибок компиляции:
- NSManagedObjectContext undeclared
- Expected specifier-qualifier-list before 'NSManagedObjectModel'
- ...
Я уже добавил основную структуру данных к цели (щелкните правой кнопкой мыши на моем проекте в разделе "Цели", "добавить" - "существующие структуры", "CoreData.рамки.)"
мой заголовок-файл:
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
[...]
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
что я упустил? Запуск нового проекта не является вариантом...
Спасибо большое!
edit
извините, у меня есть эта реализация... но похоже, что библиотека отсутствует... методы реализации полны ошибок компиляции, таких как"managedObjectContext undeclared
","NSPersistentStoreCoordinator undeclared
", но и "ожидается ')' перед NSManagedObjectContext
" (хотя кажется, что скобки являются правильными)...
#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;
}
13 ответов:
все заголовочные файлы CoreData импортируются в
App_Prefix.pch
, поэтому классы CoreData будут доступны во всем вашем проекте, поэтому вам не нужно вручную импортировать заголовок в нужные вам файлы.так что откройте Xcode и найдите какой-нибудь файл, например
App_Prefix.pch
по умолчанию этоOther Sources
группы. ПослеUIKit
оператор импорта, добавьте следующую строку:#import <CoreData/CoreData.h>
и вы должны быть готовы.
Xcode 4
для проектов созданный в Xcode 4, префиксный файл можно найти в
Supporting Files
группа в навигаторе проекта. Это называется 'имя_проекта-префикс.по ПЧ по умолчанию.Xcode 6+
начиная с Xcode 6, предварительно скомпилированный файл заголовка больше не включается по умолчанию. Это связано с введением модулей, которые уберите необходимость использовать предварительно скомпилированные заголовки. пока еще можно вручную добавить файл PCH для глобального включения Заголовки CoreData, рассмотрите возможность указания зависимости CoreData с помощью
@import CoreData;
* в каждом файле, который использует CoreData. Это делает зависимости явными и, что более важно, позволит избежать проблемы этого вопроса в будущем.* модули необходимо включить чтобы это работало.
просто изложить все шаги, которые вам действительно нужно выполнить, чтобы добавить основные данные в проект, который ранее не имел его:
Шаг 1: добавьте рамки
нажмите на цель вашего приложения (на левой панели его верхний значок с именем вашего приложения), затем перейдите на вкладку "этапы сборки", затем на "Link Binary With Libraries", нажмите маленькую " + "внизу, затем найдите" CoreData.рамки и добавить его в проект
затем либо импортировать coredata на всех объектах вам это нужно (несексуальный способ) с помощью:
Свифт
import CoreData
С
#import <CoreData/CoreData.h>
или добавить импорт ниже общего импорта в вашем .PCH файл (гораздо более сексуально), как это:
#ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> #endif
Шаг 2: Добавьте модель данных
добавить .xcdatamodel file щелкните правой кнопкой мыши / control-нажмите на свои файлы в правой панели (например, в папке ресурсов для безопасного хранения) и выберите Добавьте новый файл, перейдите на вкладку Основные данные при выборе типа файла, затем нажмите "модель данных", дайте ему имя и нажмите кнопку Далее и готово, и он добавит его в свой проект. При нажатии на этот объект модели вы увидите интерфейс для добавления объектов в ваш проект с любыми отношениями, которые вы хотите.
Шаг 3: Обновление Делегата Приложения
на Свифт на AppDelegate.Свифт
//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 }
на С обязательно добавьте эти объекты для 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
синтезировать предыдущие объекты в AppDelegate.м вот так:
@synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
затем добавьте эти методы в AppDelegate.m (не забудьте поставить имя модели, которую вы добавили в показанных местах):
- (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]; }
Шаг 4: получить объекты данных в ViewControllers, где вам нужны данные
1. Используйте делегат приложения ManagedObjectContext из VC (предпочтительно и Проще)
как предложено @brass-kazoo-получить ссылку на AppDelegate и его managedObjectContext через:
Свифт
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate appDelegate.managedObjectContext
С
[[[UIApplication sharedApplication] delegate] managedObjectContext];
в файле ViewController
2. Создайте ManagedObjectContext в своем VC и сопоставьте его с AppDelegate из AppDelegate (Original)
показывает только старую версию для Цель C так как гораздо проще использовать предпочтительный метод
в ViewController.h
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
в ViewController.м
@synthesize managedObjectContext = _managedObjectContext;
в файле AppDelegate, или класс, где в файле ViewController создается установить managedObjectContext, чтобы быть таким же, как в файле AppDelegate один
ViewController.managedObjectContext = self.managedObjectContext;
если вы хотите, чтобы viewcontroller с использованием Core Data был FetchedResultsController, вам нужно будет убедиться, что этот материал находится в вашем ViewController.h
@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> { NSFetchedResultsController *fetchedResultsController; NSManagedObjectContext *managedObjectContext; } @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
и это в ViewController.м
@synthesize fetchedResultsController, managedObjectContext;
после всего этого теперь вы можете использовать этот managedObjectContext для запуска всех обычных fetchRequests, необходимых для CoreData goodness! Наслаждайтесь
попробуйте создать приложение Cocoa с поддержкой основных данных и посмотрите на AppDelegate. Там вы увидите методы реализации стека основных данных, а также файл модели управляемых объектов для определения ваших сущностей и других материалов, связанных с основными данными.
вы показали нам только заголовок (т. е. объявление), но не реализацию (т. е. определение) основного стека данных.
для Swift 3: включает в себя сохранение и извлечение данных
Шаг 1 Добавить Рамки
Шаг 2: добавить модель данных
File > New > File > Core Data > Data Model
- название файла
SampleData
результирующий файл будетSampleData.xcdatamocelId
Шаг 3: добавить ниже функции для вашего делегата приложения и добавить "импорт CoreData" в верхней части
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)") } } }
Шаг 4: добавление сущности и атрибута в модель
Шаг 5: Сохранение Данных
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") } }
Шаг 5: Получение Данных
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") } }
Если вы столкнетесь с этой же проблемой в xcode 4, как и я. Это другое: мне нужно было выбрать проект, а затем в targets развернуть "Связать Двоичный Файл С Библиотеками" который показывает текущие библиотеки. Оттуда нажмите + (знак плюс), чтобы выбрать любые дополнительные библиотеки, которые вам нужны. Я поместил его в верхней части проекта и должен был переместить его (перетащить) в Группа Основ, но это все.
Как сказал Эймантас, вам не хватает имплементации основного стека, например
- (NSManagedObjectContext *) managedObjectContext; - (NSManagedObjectModel *)managedObjectMode; - (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
на решение будет создать новый проект драйвера основных данных и скопировать / вставить реализацию в свой проект.
Для Swift 3:
файл- > новый файл - >CoreData - > модель для создания модели.
относятся к этому ссылке для получения дополнительной информации о том, как ее реализовать.
//в Swift 2.2 вы можете сделать следующее, Не изменяя файл AppDelegate.
- проект - >цели-->связанные фреймворки и библиотеки Теперь добавьте новую структуру (нажмите на+) 'CoreData'
- File - > new file - >CoreData - >DataModel назовите его, как говорят A. xcdatamodelid
- в A. xcdatamodelid создать новый enitity (нажмите на entity+) назовите его как говорят Bc и установите его класс как " Bc " в окне инспектора справа.
- теперь добавьте атрибуты к сущности (нажмите на атрибуты +), добавьте один атрибут, например : имя и его тип в виде строки.
- теперь редактор - > создать подкласс NSManagedObject- > нажмите кнопку Далее во всплывающем окне- > снова Далее->затем нажмите кнопку Создать. Будут созданы два новых файла 1. новый класс с именем Bc.swift и расширение с именем Bc+coredataproperties.быстрый.
файл->новый файл - > ios - >класс cocoa Touch- > установите его подкласс как NSObject - >назовите его как DataController.быстрый Внутри файла включать ///
импорт UIKit импорт CoreData 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)") } }
}
//////
- теперь внутри файла viewcontroller вы можете получить доступ к вашей БД с помощью двух методов. Важно: включите оператор в свой viewController "импорт CoreData" a. вызов seed() -->для вставки значения в db / entity b. вызов fetch ()--> для извлечения значения из db / entity
///////seed ()-- > 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)") } }
вид.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
деталь.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
- (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]; } }
пример кодирования 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
пример детального просмотра
#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; } /*
savebutton
- (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