4

我正在尝试了解 Core Data 并正在关注 Apple 的“位置”教程。我遇到的一个直接绊脚石是我已经开始构建我想要使用 Core Data 的应用程序。它是一个单一的视图应用程序。

为了在此应用程序中使用 Core Data,我需要采取哪些步骤?该教程说在创建项目时选中“使用核心数据进行存储”复选框,但必须有一种方法可以在项目创建后启用核心数据。

我真的很感激一些帮助。谢谢。

4

6 回答 6

14

1.) 创建一个名为 CoreDataTutorial 的基于视图的应用程序。

2.) 将核心数据框架添加到项目中。右键单击框架,选择添加 > 现有框架……找到 CoreData.frameworks 并单击添加。

3.) 将数据模型添加到项目中。右键单击 Resources,选择 Add > New File ... 在 iOS 下选择 Resource,然后选择 Data Model 并点击 Next。

将文件命名为 CoreDataTutorial.xcdatamodel,然后点击下一步。

4.) 双击我们刚刚创建的文件CoreDataTutorial.xcdatamodel。这将打开模型对象编辑器。

在左上窗格中单击 + 符号以添加新实体。

通过在右上方窗格中输入名称来命名实体“SomeName”。

在实体仍处于选中状态时,单击顶部中间窗格中的 + 符号并选择添加属性。将此属性命名为“some_attribute_name”并将其设置为字符串类型。

5.) 现在我们要在两个实体之间创建关系。在实体窗格中选择您的实体。单击属性窗格中的 + 符号并选择添加关系。将关系命名为“creation”,将 Destination 设置为 Release,将 Delete Rule 设置为 Cascade。

要执行相反的操作,我们在实体窗格中选择 Release。单击属性窗格中的 + 符号并选择添加关系。将关系命名为“creator”,将 Destination 设置为 Artist,将 Inverse 设置为 release,将 Delete Rule 设置为 Cascade。

您现在可以关闭对象编辑器。

6.) 展开其他源并双击 CoreDataTutorial_Prefix.pch。为 CoreData 添加导入。

#ifdef __OBJC__
    #import <foundation foundation.h="">
    #import <uikit uikit.h="">
    #import <coredata coredata.h="">
#endif

这使我们不必将其导入每个文件。

7.) 接下来我们将设置应用程序委托头文件,然后是实现文件。

首先是头文件。我们需要为我们的 NSManagedObjectContext、NSManagedObjectModel 和 NSPersistentStoreCoordinator 创建变量。

我们还将声明一个名为 applicationDocumentsDirectory 的操作,该操作获取我们的数据将存储在 SQLite 文件中的调味品目录的路径。以及在应用退出时保存上下文的操作。

这是我们完成后头文件的样子。请记住,我们将 import 语句添加到 CoreDataTutorial_Prefix.pch 文件中,因此我们不需要在此处导入它。

#import <uikit uikit.h="">

@class CoreDataTutorialViewController;

@interface CoreDataTutorialAppDelegate : NSObject <uiapplicationdelegate> 
{
    UIWindow *window;
    CoreDataTutorialViewController *viewController;

@private
    NSManagedObjectContext *managedObjectContext;
    NSManagedObjectModel *managedObjectModel;
    NSPersistentStoreCoordinator *persistentStoreCoordinator;
}


@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet CoreDataTutorialViewController *viewController;

@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (NSURL *)applicationDocumentsDirectory;
- (void)saveContext;

@end

8.) 如果您不使用 ARC,请注意释放内存

9.) 实现 applicationDocumentsDirectory 方法。

/**
 Returns the URL to the application's Documents directory.
 */
- (NSURL *)applicationDocumentsDirectory 
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

10.) 接下来,实现 saveContext 方法:

- (void)saveContext 
{

    NSError *error = nil;
    NSManagedObjectContext *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. 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.
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }
} 

11.) 最后为你的变量实现你的访问器方法,就是这样。

于 2012-07-26T10:25:01.393 回答
2

转到目标->构建阶段->将二进制文件与库链接并添加CoreData.framework. 你应该很高兴去...

于 2012-04-10T11:57:38.967 回答
2

当然,您可以在启动或创建应用程序后添加核心数据支持。

我建议您执行以下操作:

  • 将核心数据框架添加到您的目标
  • 添加对象模型“添加新文件 -> 核心数据 -> 数据模型”
  • 创建您的初始对象模型
  • 为对象模型中的所有模型创建 NSManagedObject 子类
  • 创建一个控制器(子类 NSObject),在其中执行单例/静态实例(单例
  • 在您的控制器中添加一些数据层方法,例如“getObjectsXYZ”、“saveData”等。

  • 然后,在您现有的应用程序中,您可以通过控制器类加载对象,例如“ [[mycontroller sharedInstance] getObjectYByName:@"some text"]

当然,您需要深入挖掘核心数据。:)

如果您使用过 ORM,那么您可能会查看:mogenerator vimrentsch。 http://rentzsch.github.com/mogenerator/

这使得数据模型非常非常容易。我对那个工具发誓!

于 2012-04-10T12:00:03.013 回答
0

如果您需要查看访问 Core Data 需要添加的代码类型,请创建一个包含 Core Data 的虚拟项目,并查看应用程序委托中支持它的方法类型。

或者,您可以采用更好的方法将 Core Data 访问代码放在自己的类中。可以在这里找到对该策略的一个很好的描述:http: //nachbaur.com/blog/smarter-core-data

于 2012-04-10T12:02:42.867 回答
0

老实说,如果您只有一个视图,那么按照教程所述从头开始创建应用程序可能是最简单的。您需要包含很多零碎的内容,从长远来看,它可以为您节省大量时间。

但是,您可以手动完成:

  • 将 Core Data 框架添加到您的项目中
  • 添加数据模型
  • 在您的应用委托中添加代码以创建托管对象上下文(包括所有错误条件)
于 2012-04-10T12:03:48.567 回答
0

根据我的经验,在项目中包含 Core Data 的更好方法是选择具有“使用 Core Data 进行存储”选项的项目类型。您可以将现有项目中的文件包含在新项目中。当然你可以手动包含Core Data,但是会产生很多问题。

于 2012-04-10T13:07:02.140 回答