Добавление основных данных в существующий проект iPhone - PullRequest
138 голосов
/ 09 января 2010

Я хотел бы добавить основные данные в существующий проект iPhone, но я все еще получаю много ошибок компиляции:

- NSManagedObjectContext undeclared

 - Expected specifier-qualifier-list before 'NSManagedObjectModel'

 - ...

Я уже добавил Core Data Framework к цели (щелкните правой кнопкой мыши намой проект в «Цели», «Добавить» - «Существующие фреймворки», «CoreData.framework»).

Мой заголовочный файл:

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", но также с "Expected ')" до 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 ]

145 голосов
/ 09 января 2010

Все заголовочные файлы CoreData импортируются в App_Prefix.pch, поэтому классы CoreData будут доступны в вашем проекте, поэтому вам не придется вручную импортировать заголовок в нужные вам файлы.

Итак, откройте Xcode и найдите какой-нибудь файл, например App_Prefix.pch, по умолчанию он находится в группе Other Sources. После оператора UIKit import добавьте следующую строку:

#import <CoreData/CoreData.h>

И ты должен быть готов к работе.

Xcode 4

Для проектов, созданных в Xcode 4, файл префикса можно найти в группе Supporting Files в Навигаторе проектов. По умолчанию он называется ' projectname -Prefix.pch'.

Xcode 6 +

Начиная с Xcode 6, предварительно скомпилированный заголовочный файл больше не включается по умолчанию. Это связано с введением модулей, которые устраняют необходимость использования предварительно скомпилированных заголовков. Хотя все еще можно вручную добавить файл PCH для глобального включения заголовков CoreData, рассмотрите возможность указания зависимости CoreData с помощью @import CoreData;* в каждом файле, который использует CoreData. Это делает зависимости явными и, что более важно, позволит избежать проблемы этого вопроса в будущем.

* Модули должны быть включены , чтобы это работало.

127 голосов
/ 21 апреля 2014

Просто для пояснения всех шагов, которые вам действительно нужно выполнить, чтобы добавить базовые данные в проект, в котором раньше их не было:

Шаг 1: Добавить платформу

Нажмите на цель вашего приложения (на левой панели - верхний значок с названием вашего приложения), затем перейдите на вкладку «Фазы сборки», затем «Связать двоичные файлы с библиотеками», нажмите маленький «+» в внизу найдите «CoreData.framework» и добавьте его в свой проект

Затем либо импортируйте coredata на все нужные вам объекты (несексуальным способом), используя:

Swift

import CoreData

Цель C

#import <CoreData/CoreData.h>

или добавьте импорт ниже общего импорта в вашем файле .pch (гораздо более сексуально), например:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
#endif

Шаг 2. Добавьте модель данных

Чтобы добавить файл .xcdatamodel, щелкните правой кнопкой мыши / удерживайте нажатой клавишу «Control» на своих файлах на правой панели (как в папке «Ресурсы» для безопасного хранения) и выберите «Добавить новый файл». Выберите вкладку «Основные данные» при выборе типа файла затем нажмите «Модель данных», дайте ему имя, нажмите «Далее» и «Готово», и он добавит его в ваш проект. Когда вы нажмете на этот объект Model, вы увидите интерфейс для добавления сущностей в ваш проект с любыми связями, которые вы хотите.

Шаг 3. Обновление делегата приложения

In Swift на 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
}

В Цель C , убедитесь, что добавили эти объекты в 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.m следующим образом:

@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 с помощью:

Swift

 let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
 appDelegate.managedObjectContext

Цель C

 [[[UIApplication sharedApplication] delegate] managedObjectContext];

в вашем ViewController

Вариант 2. Создайте ManagedObjectContext в вашем VC и сделайте так, чтобы он совпадал с AppDelegate из AppDelegate (Original)

Показывает только старую версию для Objective C, поскольку гораздо проще использовать предпочтительный метод

в ViewController.h

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

В ViewController.m

@synthesize managedObjectContext = _managedObjectContext;

В AppDelegate или классе, в котором создается ViewController, задайте значение managedObjectContext, совпадающее с AppDelegate one

ViewController.managedObjectContext = self.managedObjectContext;

Если вы хотите, чтобы контроллер представления, использующий базовые данные, был FetchedResultsController, то вам нужно убедиться, что этот материал находится в вашем ViewController.h

@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
  NSFetchedResultsController *fetchedResultsController;
  NSManagedObjectContext *managedObjectContext;
}

 @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;

И это во ViewController.m

@synthesize fetchedResultsController, managedObjectContext;

После всего этого вы теперь можете использовать этот managedObjectContext для запуска всех обычных запросов fetch, необходимых для совершенства CoreData! Наслаждайтесь

15 голосов
/ 04 августа 2017

Для Swift 3: ВКЛЮЧАЕТ ДАННЫЕ СОХРАНЕНИЯ И ВОССТАНОВЛЕНИЯ

Шаг 1 : Добавить каркас

enter image description here

enter image description here

Шаг 2: Добавить модель данных

Файл> Создать> Файл> Основные данные> Модель данных

  • Назовите файл как SampleData результирующий файл будет SampleData.xcdatamocelId

Шаг 3: Добавьте перечисленные ниже функции в приложение «Делегат» и добавьте «import 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: Добавление сущности и атрибута в модель

а) Добавить объект enter image description here

б) Добавить атрибут enter image description here

ШАГ 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")
    }
}
11 голосов
/ 09 января 2010

Попробуйте создать приложение Cocoa, поддерживаемое Core Data, и посмотрите на AppDelegate. Там вы увидите методы реализации стека основных данных, а также файл модели управляемых объектов для определения ваших сущностей и других исходных данных.

Вы показали нам только заголовок (т. Е. Объявление), но не реализацию (т. Е. Определение) стека базовых данных.

8 голосов
/ 20 мая 2011

Если вы столкнетесь с этой же проблемой в xcode 4, как я это сделал. Это отличается: мне нужно было выбрать проект, затем в целях развернуть «Связать двоичные файлы с библиотеками» , в котором отображаются текущие библиотеки. Оттуда нажмите + (знак плюс), чтобы выбрать любые дополнительные библиотеки, которые вам нужны. Я поместил его в верхнюю часть проекта и должен был переместить (перетащить) в Frameworks Group , но это было все.

5 голосов
/ 09 января 2010

Как сказал Eimantas, вы пропустили реализацию Базового стека, как

- (NSManagedObjectContext *) managedObjectContext;
- (NSManagedObjectModel *)managedObjectMode;
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator;

По решению было бы создать новый основной драйвер данных проекта и скопировать / вставить реализацию в ваш проект.

4 голосов
/ 25 ноября 2016

Для Swift 3:

Файл-> Новый файл-> CoreData-> Модель для создания модели.

Обратитесь к этой ссылке для получения дополнительной информации о том, как ее реализовать.

1 голос
/ 02 октября 2016

// в Swift 2.2 вы можете делать следующее, не изменяя файл AppDelegate.

  1. Project-> target -> связанные рамки и библиотеки Теперь добавьте новый фреймворк (нажмите +) «CoreData»
  2. Файл-> Новый файл-> CoreData-> DataModel назовите это как сказать A.xcdatamodelid
  3. В A.xcdatamodelid создайте новый объект (нажмите на объект +) назовите его как скажем Bc и установите его класс как «Bc» в окне инспектора справа.
  4. Теперь добавьте атрибуты к сущности (нажмите на атрибуты +), добавьте один атрибут, например: имя и его тип в виде строки.
  5. Теперь редактор -> создать NSManagedObject Subclass -> нажмите кнопку «Далее» во всплывающем окне -> снова «Далее» -> затем нажмите «Создать». Будут созданы два новых файла: 1. новый класс с именем Bc.swift и расширение с именем Bc + coredataproperties.swift.
  6. Файл-> новый файл-> ios-> класс Touch Cocoa -> установить его подкласс как NSObject-> назвать его как DataController.swift Внутри файла включить ///

    импорт 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)")
        }
    
    }
    

    }

//////

  1. Теперь внутри файла viewcontroller вы можете получить доступ к вашей БД двумя способами. Важно: включите оператор в ваш viewController "импортировать CoreData" а. вызовите seed () -> чтобы вставить значение в db / entity б. вызовите fetch () -> для получения значения из db / entity

/////// семян () -> Защита

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)")
        }
    }
0 голосов
/ 15 июня 2018
 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)
0 голосов
/ 25 мая 2017
  - (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
...