繁体   English   中英

将核心数据添加到XCode 4中的现有项目

[英]Adding Core Data to existing project in XCode 4

我在没有Core Data的情况下开始了这个项目,现在我想将这个功能添加到我的应用程序中。 我该怎么做呢?

当您在创建新项目时实际勾选使用核心数据时,XCode还会设置哪些其他内容?

一个技巧是只使用Core Data支持创建一个新的空项目。 这将为您提供必要的代码,您可以将其复制到原始项目并进行编译。

唯一的问题是您需要处理Core Data头文件。 当Xcode使用模板生成文件时,它会将其放入预编译的头文件中。 因此,您可以将以下行添加到.pch文件中:

#import <CoreData/CoreData.h>

或者您可以根据需要将其添加到.m文件中。

它就像一个魅力。 请注意Luka在下面的评论,关于如何在Xcode5中做到这一点。

只是为了阐述您实际需要执行的所有步骤,以将Core Data添加到以前没有它的项目中:

第1步:添加框架

点击您的应用目标(在左侧窗格中,它的顶部图标带有您应用的名称),然后转到“构建阶段”标签,然后点击“链接二进制文件库”,点击底部的小“+”然后找'CoreData.framework'并将其添加到您的项目中

然后使用以下方法在您需要的所有对象上导入coredata(非性感方式):

#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步:更新App Delegate

将这些对象添加到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

在ViewController.h中

@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! 请享用

如果要将CoreData.framework添加到项目中,请双击“组和文件”列表中的“目标”。 转到“摘要”窗格,然后单击“链接库”的“+”。 选择CoreData.framework。 然后它将与您的项目链接。

Xcode将一大堆内容添加到Core Data的标准模板中。

如果您不熟悉它,那么创建一个新的Core Data项目并将自己的内容推入其中,而不是尝试将基础结构添加到现有项目中。

基本上你得到的是......

  • 空核心数据模型。
  • 核心数据堆栈的初始化代码

我发现最简单的方法是使用核心数据创建一个新项目,删除项目中的文件,并从非核心数据项目拖放到核心数据项目。 (Main.storyboard,AppDelegate,ViewController等)

通过将Core Data与新项目(包括)相比较,将Core Data添加到项目中非常简单。 核心数据。 您需要在AppDelegate中添加“数据模型”文件以及一些方法和ivars。

查看实现文件中的核心数据项目模板 - >“核心数据堆栈”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM