OCiOS开发:手动创建CoreData数据模型

前言

我们知道,在项目中使用CoreData存储数据,创建工程的时候我们需要勾选Use Core Data选项,如下所示:

这里写图片描述

在教学过程中,有学生这样问我,如果在项目过程中需要使用CoreData存储数据,但是在创建项目的时候并没有勾选Use Core Data选项,那又该如何操作呢?难道要重新创建项目勾选Use Core Data选项,然后再拷贝那些文件到新创建的工程中么?会不会太麻烦?答案是肯定的,不过不用担心,本篇博客,我将解决这个问题。

实现

1、首先我们需要引入CoreData FrameWork框架,具体实现方式:点击Target -> Build Phases -> Link Binary With Libraries ->点击+号按钮,如下所示:

这里写图片描述

2、点击+号之后在弹出的框中输入CoreData.framework并双击搜索到的xiang即可添加框架(注意:搜索不区分大小写)。如下所示:

这里写项图片描述

3、然后我们需要加入数据模型,选中工程文件夹(我这里是CoreDataTest),鼠标右键,再点击New File…,当然你也可以选中工程文件夹之后直接通过快捷键command + n创建文件。在弹出的界面的左边选择:iOS -> CoreData -> Data Model,如下所示:

这里写图片描述

4、点击Next,进入下一页,在Save As中键入数据模型的名字,名字可以随意写,这里我将数据模型名字与工程名一致(CoreDataTest),点击右下角的Create之后,你会发现在工程目录中多了一个CoreDataTest.xcdatamodeld文件,如下所示:

这里写图片描述

5、做好以上的这些工作之后,不要先急着去创建Entity。而是去Delegate中建立CoreData与Delegate的关联。这时,点击AppDelegate.h文件,引入头文件:#import<CoreData/CoreData.h>,然后在@interface与@end之间(即类的接口部分)加入以下代码:

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

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

Tips

上面的代码有几个名字术语:NSManagedObjectContext、NSManagedObjectModel、NSPersistentStoreCoordinator。

1、Managed Object Model(管理数据模型):你可以将这个东西看作是数据库的轮廓,或者结构。这里包含了各个实体的定义信息,一般来说,你会使用我们刚刚看过的视觉编辑器来操作这个物体,添加属性,建立属性之间的关系等等,当然你也可以使用代码。

2、Persistent Store Coordinator(持久性数据协调器): 你可以将这个东西看作是数据库连接库,在这里,你将设置数据存储的名字和位置,以及数据存储的时机。

3、Managed Object Context (管理数据内容):你可以将这一部分看作是数据的实际内容,这也是整个数据库中对我们而言最重要的部分(这还用说),基本上,插入数据,查询数据,删除数据的工作都在这里完成。

6、之后打开AppDelegate.m文件,在@implementation下面写入如下代码:

#pragma mark - Core Data stack

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (NSURL *)applicationDocumentsDirectory {
    // The directory the application uses to store the Core Data store file. This code uses a directory named "com.rimi.Test" in the application's documents directory.
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

- (NSManagedObjectModel *)managedObjectModel {
    // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }

    // **** 注意 ***
    // 这里的CoreDataTest就是你刚才建立的数据模型的名字,一定要一致,否则会报错。

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataTest" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it.
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    // Create the coordinator and store

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    // **** 注意 ***
    // 这里的CoreDataTest.sqlite也应该与数据模型的名字保持一致,否则会报错。

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataTest.sqlite"];
    NSError *error = nil;
    NSString *failureReason = @"There was an error creating or loading the application's saved data.";
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // Report any error we got.
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
        dict[NSLocalizedFailureReasonErrorKey] = failureReason;
        dict[NSUnderlyingErrorKey] = error;
        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
        // Replace this 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.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}


- (NSManagedObjectContext *)managedObjectContext {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) {
        return nil;
    }
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    return _managedObjectContext;
}

#pragma mark - Core Data Saving support

- (void)saveContext {
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        NSError *error = 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.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

Tips

一定要观察上述代码中的注意事项,代码中关联的名字必须与数据模型的名字一致,否则会报错。

7、ok,到这一步,手动创建CoreData数据模型就结束了,接下来你就可以正常使用CoreData来存储数据了,如果有什么疑问,欢迎评论,也感谢大家对我的关注与支持,我将继续努力,也希望大家如果觉得文章不错,欢迎转载分享。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值