我在没有Core Data的情况下开始了这个项目,现在我想将这个功能添加到我的应用程序中。我该怎么做呢?
当您在创建新项目时实际勾选使用核心数据时,XCode会设置哪些其他内容?
答案 0 :(得分:42)
一个技巧是只使用Core Data支持创建一个新的空项目。这将为您提供必要的代码,您可以将其复制到原始项目并进行编译。
唯一的问题是您需要处理Core Data头文件。当Xcode使用模板生成文件时,它会将其放入预编译的头文件中。因此,您可以将以下行添加到.pch文件中:
#import <CoreData/CoreData.h>
或者您可以根据需要将其添加到.m文件中。
它就像一个魅力。请注意Luka在下面的评论,关于如何在Xcode5中做到这一点。
答案 1 :(得分:19)
只是为了阐述您将Core Data添加到之前没有它的项目中实际需要执行的所有步骤:
点击您的应用目标(在左侧窗格中显示带有应用名称的顶部图标),然后转到“构建阶段”标签,然后点击“链接二进制文件库”,点击“+”链接然后找到'CoreData.framework'并将其添加到您的项目
然后使用以下方法在所有需要的对象上导入coredata(非性感方式):
#import <CoreData/CoreData.h>
或在.pch文件中添加常见导入下方的导入(更加性感),如下所示:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
要添加.xcdatamodel文件,请右键单击/按住Control键并单击右侧窗格中的文件(如在“资源”文件夹中保存),然后选择“添加新文件”,在选择文件类型时单击“核心数据”选项卡然后单击“数据模型”,为其命名并单击“下一步”和“完成”,它将把它添加到您的项目中。当您单击此Model对象时,您将看到使用您想要的任何关系将实体添加到项目的界面。
将这些对象添加到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];
}
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
在ViewController.m
中@synthesize managedObjectContext = _managedObjectContext;
在AppDelegate或创建ViewController的类中,将managedObjectContext设置为与AppDelegate相同
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 :(得分:2)
如果要将CoreData.framework添加到项目中,请双击“组和文件”列表中的“目标”。转到“摘要”窗格,然后单击“链接库”的“+”。选择CoreData.framework。然后它将与您的项目链接。
答案 3 :(得分:1)
Xcode将一大堆内容添加到Core Data的标准模板中。
如果您不熟悉它,那么创建一个新的Core Data项目并将自己的内容推入其中,而不是尝试将基础结构添加到现有项目中。
基本上你得到的是......
答案 4 :(得分:0)
通过将Core Data与新项目(包括新项目)进行比较,可以非常简单地将Core Data添加到项目中。核心数据。您需要在AppDelegate中添加“数据模型”文件以及一些方法和ivars。
查看实施文件中的核心数据项目模板 - &gt; “核心数据堆栈”。
答案 5 :(得分:0)
我发现最简单的方法是使用核心数据创建一个新项目,删除项目中的文件,然后从非核心数据项目拖放到核心数据项目。 (Main.storyboard,AppDelegate,ViewController等)