기존 iPhone 프로젝트에 Core Data 추가


138

기존 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;

내가 무엇을 놓치고 있습니까? 새 프로젝트를 시작하는 것은 옵션이 아닙니다 ...

고마워요!

편집 죄송합니다, 구현 방법 "과 같은 컴파일 오류가 가득 ... 나는 그 구현을해야합니까 ...하지만 도서관이없는 것처럼 보인다 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;
}

답변:


144

모든 CoreData 헤더 파일은에서 App_Prefix.pch가져 오기 때문에 프로젝트 전체에서 CoreData 클래스를 사용할 수 있으므로 필요한 파일에서 헤더를 수동으로 가져올 필요가 없습니다.

Xcode를 열고 같은 파일을 찾으십시오. App_Prefix.pch기본적으로 Other Sources그룹에 있습니다. 애프터 UIKitimport 문, 다음 줄을 추가합니다 :

#import <CoreData/CoreData.h>

그리고 당신은 갈 준비가되어 있어야합니다.

Xcode 4

Xcode 4에서 생성 된 프로젝트의 경우 접두사 파일은 Supporting Files프로젝트 탐색기 의 그룹에서 찾을 수 있습니다 . 기본적으로 ' projectname -Prefix.pch'입니다.

Xcode 6 이상

Xcode 6부터는 사전 컴파일 된 헤더 파일이 더 이상 기본적으로 포함되지 않습니다. 사전 컴파일 된 헤더를 사용할 필요가없는 모듈이 도입 되었기 때문입니다 . CoreData 헤더를 전체적으로 포함하기 위해 PCH 파일을 수동으로 추가 할 수는 있지만 CoreData를 사용 @import CoreData;하는 모든 파일에서 *를 사용하여 CoreData 종속성을 지정하십시오 . 이것은 의존성을 명시 적으로 만들고 더 중요한 것은 앞으로이 질문의 문제를 피할 것입니다.

* 이 기능사용하려면 모듈 을 활성화해야합니다 .


App_prefix.pch 파일을 찾을 수 없으면 xcode 6.4 및 ios 8.4에서 작동합니다.
Anees

128

이전에 가지고 있지 않은 프로젝트에 코어 데이터를 추가하기 위해 실제로 수행해야하는 모든 단계에 대해 설명하기 만하면됩니다.

1 단계 : 프레임 워크 추가

앱 대상 (왼쪽 창에서 앱 이름이있는 상단 아이콘)을 클릭 한 다음 '빌드 단계'탭으로 이동 한 다음 '이진과 라이브러리 연결'에서 맨 아래에있는 작은 '+'를 클릭 한 다음 'CoreData.framework'를 프로젝트에 추가하십시오.

그런 다음 다음을 사용하여 필요한 모든 개체 (섹시하지 않은 방법)의 코어 데이터를 가져옵니다.

빠른

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 파일을 추가하려면 오른쪽 창에서 파일을 마우스 오른쪽 버튼으로 클릭 / 제어-클릭하고 (안전하게 유지하기 위해 Resources 폴더에서와 같이) 새 파일 추가를 선택하려면 파일 유형을 선택할 때 코어 데이터 탭을 클릭 한 다음 ' 데이터 모델 '에서 이름을 지정하고 다음 및 완료를 클릭하면 프로젝트에 추가됩니다. 이 모델 객체를 클릭하면 원하는 관계로 프로젝트에 엔티티를 추가 할 수있는 인터페이스가 표시됩니다.

3 단계 : 앱 델리게이트 업데이트

에서 스위프트 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 단계 : 데이터가 필요한 ViewController에 데이터 개체 가져 오기

옵션 1. VC에서 App Delegate의 ManagedObjectContext 사용 (선호하고 더 쉬움)

@ brass-kazoo에 의해 제안 된 것처럼-AppDelegate 및 해당 managedObjectContext에 대한 참조를 다음을 통해 검색하십시오.

빠른

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

목표 C

 [[[UIApplication sharedApplication] delegate] managedObjectContext];

ViewController에서

옵션 2. VC에서 ManagedObjectContext를 작성하고 AppDelegate의 AppDelegate (원본)와 일치 시키십시오.

선호하는 방법을 훨씬 쉽게 사용할 수 있으므로 Objective C의 이전 버전 만 표시

ViewController.h에서

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

ViewController.m에서

@synthesize managedObjectContext = _managedObjectContext;

AppDelegate 또는 ViewController가 작성된 클래스에서 managedObjectContext를 AppDelegate one과 동일하게 설정하십시오.

ViewController.managedObjectContext = self.managedObjectContext;

Core Data를 사용하는 viewcontroller가 FetchedResultsController가 되려면이 항목이 ViewController.h에 있는지 확인해야합니다.

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

 @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;

그리고 이것은 ViewController.m에 있습니다.

@synthesize fetchedResultsController, managedObjectContext;

그 후 이제이 managedObjectContext를 사용하여 CoreData 양호에 필요한 모든 일반적인 fetchRequests를 실행할 수 있습니다! 즐겨


2
AppDelegate.h에서 applicationDoumentsDirectory 메소드는 NSString 대신 NSURL을 리턴해야합니다.
NSRover

9
이것은 최고의 답변 IMO입니다! 비록 단계 4 대신에 나는 via를 통해 AppDelegate에 대한 참조를 검색 한 [[UIApplication sharedApplication] delegate]다음[appDelegate managedObjectContext]
via

AppDelegate.h 파일에서 Coredata를 가져 오는 것을 잊지 마십시오.
Frantzdy Romain

18

스위프트 3의 경우 : 데이터 저장 및 검색 포함

1 단계 : 프레임 워크 추가

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

2 단계: 데이터 모델 추가

파일> 새로 작성> 파일> 핵심 데이터> 데이터 모델

  • SampleData결과 파일의 이름을 파일로 지정하십시오 .SampleData.xcdatamocelId

3 단계 : App Delegate에 아래 기능 추가 및 "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 단계 : 모델에 엔티티 및 속성 추가

a) 엔터티 추가 여기에 이미지 설명을 입력하십시오

b) 속성 추가 여기에 이미지 설명을 입력하십시오

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

Core Data 지원 Cocoa 애플리케이션을 작성하고 AppDelegate를보십시오. 엔터티 및 기타 코어 데이터 관련 항목을 정의하기위한 관리되는 개체 모델 파일뿐만 아니라 핵심 데이터 스택 구현 방법이 표시됩니다.

핵심 데이터 스택의 헤더 (예 : 선언) 만 구현 (예 : 정의)하지는 않았습니다.


신속한 3의 경우 ColossalChris의 단계를 사용했지만 AppDelegate의 일부에서는이 답변 (핵심 데이터 지원으로 새 프로젝트에서 복사)을 사용하여 신속한 3 호환 코드를 얻었습니다.
MrAn3

8

내가 한 것처럼 xcode 4에서 이와 동일한 문제가 발생하면. 다른 점 : 프로젝트를 선택해야했는데 대상에서 "라이브러리와 바이너리 연결"을 확장 하면 현재 라이브러리가 표시됩니다. 거기에서 + (더하기 부호)를 클릭하여 필요한 추가 라이브러리를 선택하십시오. 프로젝트 상단에 배치하고 프레임 워크 그룹으로 드래그 (드래그 앤 드롭)해야 했지만 그게 끝났습니다.


5

Eimantas가 ​​핵심 스택 구현을 놓쳤다 고 언급 한 것처럼

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

해결책은 새로운 핵심 데이터 드라이버 프로젝트를 만들고 구현을 프로젝트에 복사하여 붙여 넣는 것입니다.


2
컨텍스트를 관리하는 방법은 모델을 알고 있습니까? 자동으로?
fengd

4

스위프트 3의 경우 :

파일-> 새 파일-> CoreData-> 모델을 작성하십시오.

구현 방법에 대한 자세한 정보는 이 링크 를 참조하십시오 .


1

// Swift 2.2에서는 AppDelegate 파일을 변경하지 않고 다음을 수행 할 수 있습니다.

  1. 프로젝트-> 대상-> 링크 된 프레임 워크 및 라이브러리 이제 새로운 프레임 워크를 추가합니다 (+ 클릭) 'CoreData'
  2. 파일-> 새 파일-> CoreData-> DataModel 이름을 A.xcdatamodelid라고 지정하십시오.
  3. A.xcdatamodelid에서 새로운 enitity를 생성하고 (Entity +를 클릭하십시오) Bc로 이름을 지정하고 오른쪽의 인스펙터 창에서 클래스를 'Bc'로 설정하십시오.
  4. 이제 엔티티에 속성을 추가하고 (속성 + 클릭) 예를 들어 name 및 해당 유형에 대한 속성 하나를 문자열로 추가하십시오.
  5. 이제 편집기-> NSManagedObject 서브 클래스 생성-> 팝업 창에서 다음을 클릭하고 다시 다음에 클릭 한 다음 생성을 클릭합니다. Bc.swift라는 새로운 클래스와 Bc + coredataproperties.swift라는 확장이라는 두 개의 새로운 파일이 생성됩니다.
  6. File-> new file-> ios-> cocoa Touch class-> 서브 클래스를 NSObject로 설정-> 이름을 DataController.swift로 지정합니다.

    import UIKit import 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 파일 내에서 두 가지 방법을 사용하여 db에 액세스 할 수 있습니다. 중요 : viewController "import CoreData"에 명령문을 포함하십시오. db / entity에 값을 삽입하려면 seed ()->를 호출하십시오. 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 () 데프

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

view.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

detail.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

0
  - (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

귀하의 솔루션에 대한 설명을 부탁드립니다 ... 또한, 관련이없는 주석 코드가없는 최소한의 코드 ...
yakobom

0
 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
+(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];
    }    


}

0

샘플 코딩 뷰 1

#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;




}
     /*

저장 버튼

    - (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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.