iOS coredata 因学习曲线陡峭,所以用的人不多。
为啥陡峭?
因为coredata不走sql寻常路,自己全新搞了一套,我们忽然发现之前学的那些sql小技巧似乎都用不上了。
然后网上的教程都是东一坨西一坨的,看起来和盲人象差不多,看英文原版教程吧,发现自己的英文山寨四级水平大概只适合看hello world,只恨当年没有好好苦练英文。再加上iOS操作系统的版本不断升级,前人积累的经验显得更加碎片,给本来就一头雾水的同学平添更多难度。
因此特编写本文,仅适合从来没有接触过coredata,但是又想上手一试的同学,帮助大家在5分钟之内了解coredata的基本用法;
真经一句话,假言万卷书。
开始表演~
一、非常重要的前提
(1)仅适合iOS 10+,如果想看老版本下的兼容处理,本文不适合;
(2)仅适合从来没有接触过coredata,但是又想上手一试的同学,已经了解过的同学就请直接跳过吧,不要浪费生命;
(3)本文代码在xcode 12.4,iOS 10+ 环境测试通过;
(4)本文编写时间为2021年3月 ,如果你看到本文的时间与编写时间相距过于久远,建议也不要看了,因为随着技术的发展,这些文字对你来说可能已经是毒药了;
二、如何开始
在iOS中使用coredata的基本思路就是:
建立数据表模型-->创建对应的实体类-->针对实体类增删改查
2.1、建立数据表模型
用xcode提供的可视化工具创建数据表字段;
如下图所示:

其中,
位置1
位置1的名字为:PackageModel.xcdatamodeld
可以把这个文件看作mysql中的一个schema(sqlserver里的一个数据库),或者sqlite里的一个数据库文件;
这个文件可以通过xcode>file>new>file>Core Data>Data Model 菜单操作来建立;
如下图:

位置2
就看做数据表结构定义吧
在这里定义了2张数据表
位置3
指定数据表的字段名称和字段数据类型
位置4
表和表之间的主外键关联,比如1:1的就是To One,1:* 的就是To many
2.2、创建实体类文件
现在表定义好了,要开始定义和这些表结构对应的实体类文件了。
实体类文件可以自动生成;
方法如下:
(1)打开PackageModel.xcdatamodeld这个倒霉的数据库文件,
然后在打开的界面下通过xcode菜单来操作:
xcode > Editor > Create NSManagedObject Subclass,xcode会帮你在你自己指定的位置创建好对应的实体类文件;

创建好的实体类的样子如下:

2.3、开始编写代码,愉快的CRUD吧~
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface AppManager : NSObject
@property(nonatomic) NSPersistentContainer *persistentContainer;
@end
......下面是.m文件里的内容
- (void)configDbModel {
self.persistentContainer = [NSPersistentContainer persistentContainerWithName:@"PackageModel"];
[self.persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription * _Nonnull description, NSError * _Nullable error) {
NSLog(@"error:%@",error.localizedDescription);
//创建一个条新的空白记录,然后写点东西
PackageMO *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Package" inManagedObjectContext:self.persistentContainer.viewContext];
obj.packageId = 100;
obj.packageName = @"我是一头猪";
//保存到数据库里
NSManagedObjectContext *context = self.persistentContainer.viewContext;
NSError *errorSave = nil;
[context save:&errorSave];
//再读出来
NSError *errorFetch = nil;
NSFetchRequest *request = [PackageMO fetchRequest];
NSArray *array = [context executeFetchRequest:request
error:&errorFetch];
for (PackageMO *p in array) {
NSLog(@"%ld,%@",(long)p.packageId,p.packageName);
}
}];
}
//日志:
2021-03-05 01:06:31.297519+0800 MarketPromotion[5472:1638998] 100,我是一头猪
代码中,NSPersistentContainer 的实例是核心关键,就当作是前文中所述数据库的肉身管理器吧。
NSManagedObjectContext,也就是上面的代码中的self.persistentContainer.viewContext,就当作是NSPersistentContainer这个数据库肉身管理器的操作API吧。
NSFetchRequest 就当作sql里select语句的变身好了。
三、后记
coredata博大精深,这就是起了头,要想用的好,还是得多找更多高级的文档看看。我们就此别过,缘聚缘散,愿君码路之上一码平川~
网友评论