Chỉ cần giải thích tất cả các bước bạn thực sự cần thực hiện để thêm Dữ liệu cốt lõi vào dự án mà trước đây không có:
Bước 1: Thêm khung
Nhấp vào mục tiêu ứng dụng của bạn (ở khung bên trái là biểu tượng trên cùng với tên ứng dụng của bạn), sau đó chuyển đến tab 'Xây dựng giai đoạn' sau đó trên 'Liên kết nhị phân với thư viện', nhấp vào '+' nhỏ ở dưới cùng sau đó tìm 'CoreData.framework' và thêm nó vào dự án của bạn
Sau đó, nhập coredata vào tất cả các đối tượng bạn cần (cách không gợi cảm) bằng cách sử dụng:
Nhanh
import CoreData
Mục tiêu C
#import <CoreData/CoreData.h>
hoặc thêm nhập dưới các nhập phổ biến trong tệp .pch của bạn (gợi cảm hơn nhiều) như thế này:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
Bước 2: Thêm mô hình dữ liệu
Để thêm tệp .xcdatamodel, nhấp chuột phải / nhấp chuột điều khiển vào tệp của bạn trong ngăn bên phải (như trong thư mục Tài nguyên để giữ an toàn) và chọn Thêm tệp mới, Nhấp vào tab Dữ liệu lõi khi chọn loại tệp của bạn sau đó nhấp vào ' Mô hình dữ liệu ', đặt tên cho nó và nhấp vào Tiếp theo và Kết thúc và nó sẽ thêm nó vào dự án của bạn. Khi bạn nhấp vào đối tượng Model này, bạn sẽ thấy giao diện để thêm các Thực thể vào dự án của bạn với bất kỳ mối quan hệ nào bạn muốn.
Bước 3: Cập nhật đại biểu ứng dụng
Trong Swift trên 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
}
Trong Mục tiêu C, đảm bảo thêm các đối tượng này vào 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
Tổng hợp các đối tượng trước đó trong AppDelegate.m như thế này:
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
Sau đó thêm các phương thức này vào AppDelegate.m (đảm bảo đặt tên của mô hình mà bạn đã thêm vào các điểm được hiển thị):
- (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];
}
Bước 4: Nhận các đối tượng dữ liệu cho ViewControllers nơi bạn cần dữ liệu
Tùy chọn 1. Sử dụng ManagedObjectContext của Đại biểu ứng dụng từ VC (Được ưa thích và dễ dàng hơn)
Như được gửi bởi @ Brass-kazoo - Truy xuất tài liệu tham khảo đến AppDelegate và ManagedObjectContext của nó thông qua:
Nhanh
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.managedObjectContext
Mục tiêu C
[[[UIApplication sharedApplication] delegate] managedObjectContext];
trong ViewContoder của bạn
Tùy chọn 2. Tạo ManagedObjectContext trong VC của bạn và để nó khớp với AppDelegate của AppDelegate (Bản gốc)
Chỉ hiển thị phiên bản cũ cho Objective C vì dễ sử dụng phương thức ưa thích hơn nhiều
trong ViewControll.h
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
Trong ViewControll.m
@synthesize managedObjectContext = _managedObjectContext;
Trong AppDelegate hoặc lớp nơi ViewContoder được tạo, đặt ManagedObjectContext giống với AppDelegate
ViewController.managedObjectContext = self.managedObjectContext;
Nếu bạn muốn trình điều khiển xem sử dụng Dữ liệu lõi là FetchedResultsCont kiểm thì bạn cần đảm bảo công cụ này nằm trong ViewContoder.h của bạn
@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
Và đây là trong ViewContoder.m
@synthesize fetchedResultsController, managedObjectContext;
Sau tất cả những điều đó, giờ đây bạn có thể sử dụng ManagedObjectContext này để chạy tất cả các fetchRequests thông thường cần thiết cho sự tốt lành của CoreData! Thưởng thức