이전에 가지고 있지 않은 프로젝트에 코어 데이터를 추가하기 위해 실제로 수행해야하는 모든 단계에 대해 설명하기 만하면됩니다.
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를 실행할 수 있습니다! 즐겨