使用 perform 确保正确的队列 为了杜绝上面代码中的错误,我们必须将对托管对象上下文和托管对象的操作放入正确的队列中。...且调用的是主队列上下文或属于该上下文的托管对象,否则最保险的方式是使用 perform 来杜绝出错。...通过 NSManagedObject 来查找上下文 在某些情况下,只能获得托管对象(NSManagedObject),通过从中获取托管对象上下文,保证在正确的队列中对其操作。...以上面删除 Item 的代码为例:假设该托管对象是在主队列中获取到的(在视图中通过@FetchRequest 或 NSFetchedResultsController),点击视图按钮,调用 delItem...此时就需要根据设置的合并策略来解决如何取舍的问题。 使用 mergePolicy 设定合并冲突策略。
// 我们先声明了一个NSPersistentContainer类型的属性:persistentContainer,在适合的时间调用initWithName:对其初始化 // 这里的Name参数,需要和后续创建的...为什么要用NSManagedObject子类 这时候其实可以进行数据的增删查改了。...4、删 删除数据比较简单,直接调用NSManagedObjectContext的deleteObject:方法即可。...如果要大批量修改数据,将数据从沙盒加载到内存,再进行修改,不利于性能,所以可以使用NSBatchUpdateRequest 、NSBatchDeleteRequest,进行批量的修改或者删除。...NSManagedObjectContext的hasChanges方法,来判断:在数据有变化的情况下再调用save:方法。
由于 SwiftData 结合了众多 Swift 语言的最新特性,因此,在很多场合下,开发者需要用全新的思维来重新设计数据处理逻辑。...模型代码解析 在本节中,我们将对 SwiftData 的模型代码进行剖析,这些代码是以 Xcode 提供的 SwiftData 项目模板中的模型为基础,让我们揭开它神秘的面纱。...下面是 SwiftDataKit[5] 中用于从 BackingData 中获取对应 NSManagedObject 实例的代码: public extension BackingData {...createBackingData 来创建 backingData 的实例时,不需要 ModelContext( NSMangedObjectContext )的存在。...isDeleted:表示是否已添加到 ModelContext 的删除列表,与 NSManagedObject 的同名属性功能类似。
建好后你会发现工程中多了 XXXXXXX.xcdatamodeld,我们需要在这里添加实体(首字母大写)和实体的属性。...这里我们需要创建Person和Card的实体以及实体属性: ? ? 实体间的关系:选中Person实体,在Person中添加card属性: ?...; } // 如果是想做更新操作:只要在更改了实体对象的属性后调用[context save:&error],就能将更改的数据同步到数据库 } 3、删:删除数据 /** 删除数据...这里有个坑,在Xcode8中,Codegen下拉选择框中增加了Class/Definition这一选项,而且是默认的预设值,这时候系统会自动帮我们这个实体创建了NSManagedObject子类,我们不需要再创建实体类...推荐通过CocoaPods安装MagicalRecord,需要在Podfile中加入下面命令,后续只需要通过命令来更新。
前言随着应用程序和用户群的增长,你需要添加新功能,删除其他功能,并改变应用程序的工作方式。这是软件开发生命周期的自然结果,我们应该接受。随着应用程序的发展,你的数据模型也会发生变化。...但是,有些情况下,你需要通过提供一个映射模型来自定义迁移过程,告诉 Core Data 究竟如何从源模型迁移到目标模型中的每个属性和实体。...甚至有些情况下,映射模型是不够的,你需要编写自定义迁移策略来处理特定情况。这是本文要重点讨论的情况。示例让我们考虑一个应用程序,在 Core Data 栈中存储表示音乐曲目的对象。...创建一个新的模型版本首先,让我们通过选择 .xcdatamodeld 文件,然后从菜单栏中选择 Editor > Add Model Version... 来创建一个新的模型版本。...首先,它解释了什么是 Core Data 迁移,以及为什么需要进行迁移。接着,通过一个示例应用程序,详细介绍了如何更新数据模型,添加新实体和关系,以解决现有模型的可扩展性问题。
image.png NSManagedObject是我们的数据模型,也就是我们存储的对象。这些对象都保存在NSManagedObjectContext中,每个存储对象都知道自己对应哪个上下文。...它其实是内存中的一块区域,对象所有的操作都需要一个context。直到save之前,都是在内存中,不会对数据库中的内容有任何影响。...要求: 从本地数据库中读取名字列表 点击增加可以添加一个名字 添加的名字可以保存到本地数据库中 好,接下来咱们来一步一步实现这个需求。...但是,实际开发中不建议使用这种方式创建。通常情况下我们都会把生成的模板代码都删除的。...当然,现在里面是还不能存数据的,还需要我们设置一下字段名称。 image.png 第一步,要添加一个Entity,这个就相当于是数据库中的一张表。 第二步,对新建的Entity命名。
这个类,仅用于高效地管理从Core Data中取回的数据,供UITableView使用,也就是作为UITableView的数据源而存在的。...(在这段代码之前,我们已经声明了一个属性@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController...当然,也可以选择Binary Data: 保存前,调用NSKeyedUnarchiver的archivedDataWithRootObject:方法返回NSData类型数据,让Core Data可以对其进行保存...; 取回时,用NSKeyedUnarchiver的unarchiveObjectWithData:方法,将取回的NSData数据,转换回数组、字典对象。...,作为NSManagedObject类的子类,由CoreData直接保存; 如果不定义成实体,需要: 该自定义对象需要遵守NSCoding协议并实现required方法(initWithCoder:方法和
除此之外,你需要使用 Xcode 的 UI 和映射模型来定义所有这些内容,这使得 PR 难以审查,错误难以发现。...将此属性转换也将使模型更灵活、更易于维护,因为我们将能够删除 json 属性本身和 artistName,而使用新的关系。...第三个模型版本删除了 json 和 artistName 属性。这将是一个轻量级的阶段。我们需要将迁移分解为三个阶段的原因是,就目前而言,我们不能在同一个阶段中使用并删除属性。...我们创建了一个 NSCustomMigrationStage 实例,并传递我们要从何处迁移和迁移到的对象模型引用。文件名需要与包中的 .mom 文件的名称匹配。...我们定义了 didMigrateHandler 闭包,在模型迁移后调用。此时,新的模型版本可在上下文中使用,你可以填充其属性。
当我着手编写这篇文章时,又发现需要另一篇文章来具体说明 Core Data 版本的实现过程。由此偶然间诞生了这篇文章。 在本文中,我们不会深入讨论从构建数据模型到创建托管对象实例的每个细节。...这使得我们可以在需要的时候对属性进行自定义的逻辑操作,例如数据格式转换、数据校验等。...通过可视化操作,我们可以直观地在图形界面中添加、编辑和删除实体、属性和关系,而不需要手动编写大量的代码。这使得数据模型的创建和维护变得更加容易和快速。...最常见的获取托管对象实例的途径有两种: 设置谓词,通过 NSFetchRequest ,Core Data 将符合条件数据以托管对象的形式返回给开发者 通过直接调用与 Entity 对应的 NSManagedObject...需要注意的是,当我们使用 Item.entity() 来获取 Item 对应的 EntityDescription 时,需确保 NSManagedObjectModel 已经被 NSPersistentStoreCoordinator
我们通过它来监测 Managed Object。监测数据对象有两个作用:支持 undo/redo 以及数据绑定。这个类是最常被用到的。 ...一般我们无需与它直接打交道来读写文件,Managed Object Context 在背后已经为我们调用 Persistent Store Coordinator 做了这部分工作。...我们可以使用谓词来设置查询条件,通常会将常用的 Fetch Requests 保存到 dictionary 以重复利用。...,我们往往要将大量修改后的NSManagedObject 加载到 NSManagedObjectContext 中并保存,这会占用大量内存,试想想在iPhone这样的内存有限的移动设备上将是个灾难,数据有可能丢失...除了上面提到的这些,还要注意Batch Updates对数据库的操作是乐观锁,也就是假定很少会发生同时存取同一块数据的情况,所以你需要制定一个合理的”merge”策略来应付因同时更新数据产生的冲突。
Care Data的核心对象是托管对象上下文NSManagedObjectContext,所有实体都处于托管对象上下文管理中,Care Data应用对实体所做的任何增、删、查、改操作都必须通过托管对象上下文来完成...当开发者使用Xcode的图形界面设计了实体与实体的关联关系之后,需要使用该对象来加载、管理应用的托管对象模型。...对于普通的增、删、查、改操作,需要分别先创建实体、删除实体、修改实体,然后调用NSMannagedObjectContext对象的save:方法将这些修改保存到底层存储设备。...删除实体的步骤如下: 首先获取要删除的实体,然后调用NSManagedObjectContext对象的deleteObject:方法删除实体。...如下代码: // 获取将要删除的实体 Bison* deleteEvent = .....; // 从托管对象上下文中删除指定对象 [self.appDelegate.managedObjectContext
本文将讨论,在不使用 Core Data 数据栈的情况下,开发者如何在 SwiftData 中调用 Core Data 提供的高级功能,以扩展 SwiftData 目前的能力。...如此一来,SwiftData 在数据模型声明上的优势便当然无存,不仅增加了工作量,开发者还需要面对如何处理两个数据框架、模型版本之间的协作问题。...通过 Swift 语言提供的反射 ( Mirror ) 功能,我们可以从 SwiftData 的某些组件中提取出需要的 Core Data 对象,例如从 PersistentModel 中提取出 NSManagedObject...利用 NSManagedObjectContext 实现分组计数 在某些场景下,我们需要对数据进行分组后计数,比如统计不同出生年份的学生人数。...modelContext.fetch(categoryDescription).first } 在示例中,是通过 Category 的 name 来创建谓词并获取数据。
OC对象,通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量!...版本升级和数据库迁移 [增删改查.gif] 1、首先创建一个coreData 模型文件:系统创建或者自己创建 [系统创建模型文件.png] [自己创建模型文件.png] 2、在data Model 中创建项目中需要用到的实体...被管理的数据记录 NSFetchRequest 数据请求 NSEntityDescription 表格实体结构 ①、自己创建模型文件时需要以下代码来手动生成上下文,关联数据库 //创建数据库 - (void...]; deleRequest.predicate = pre; //返回需要删除的对象数组 NSArray *deleArray = [_context executeFetchRequest...:deleRequest error:nil]; //从数据库中删除 for (Student *stu in deleArray) { [_context deleteObject
一、CoreData结构 可以用两张图来表示: NSManagedObject 数据库对象,一个NSManagedObject对应一张表,NSManagedObject的一个属性对应数据表的一个字段...数据库的增删查改就是操作NSManagedObject,通过xCode->Editor->Create NSManagedObject Subclass…来创建对应表的对象model NSManagedObjectContext...NSManagedObject操作的上下文,NSManagedObject的操作会先缓存在上下文中,还未存到磁盘中 - (NSManagedObjectContext *)managedObjectContext...:文件保存路径、NSManagedObjectModel NSManagedObjectModel 生成这个类的来源就是在 xCode 里的.xcdatamodeld文件,我们可以可视化的对这个文件进行操作...由于大部分的操作都是privateContext在子线程中操作的,所以这种设计是UI线程耗时最少的一种设计,但是它的代价是需要多写mergeChanges的方法。
image-20211112143836634 选择性拷贝 当进行深拷贝时,有时我们并不需要复制所有关系层级中的全部数据,可能会想在第 n 个层级忽略某个 n+1 级的关系分支。...尤其当我们无法直接调用托管对象实例属性时,使用 setPrimitiveValue 可以方便的利用 AttributeName 来设置 Value。...使用它来设置关系内容,需要在关系的两侧都进行对应的工作,代码量将显著提高。...我们无法直接使用这些系统预置的方法,但可以通过 setValue 来设置关系数据。...当我们从 Note 向下深拷贝到 Memo 时,如果继续对 Tag 进行复制,则会和 Tag 的设计初衷相违背。 解决方案为,当在关系链中碰到了逆向关系为对多的实体 A,则不再继续向下拷贝。
OC对象,通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量!...自己创建模型文件.png 2、在data Model 中创建项目中需要用到的实体(Entities),例如,创建一个Student 实体(第一字母必须是大写),以及添加一些name、age、sex 等属性...被管理的数据记录 NSFetchRequest 数据请求 NSEntityDescription 表格实体结构 ①、自己创建模型文件时需要以下代码来手动生成上下文,关联数据库 //创建数据库 - (void...]; deleRequest.predicate = pre; //返回需要删除的对象数组 NSArray *deleArray = [_context executeFetchRequest...:deleRequest error:nil]; //从数据库中删除 for (Student *stu in deleArray) { [_context deleteObject
7.1、模型文件 7.2、NSManagedObject 7.3、coredata 主要对象 7.4、搭建coredate上下文 7.5、添加数据 7.6、查询数据 7.7、删除数据 7.8、打开coredata...例如,游戏应用可将游戏存档保存在该目录 3、tmp: 保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。...NSUserDefaults设置数据的时候,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。...比如,我们可以在Keychain中存储用户名、密码等信息。 Keychain的安全机制从系统层面保证了存储的敏感信息不会被非法读取或者窃取。...Keychain的特点如下: 1、保存在Keychain中的数据,即使应用程序被卸载,数据仍然存在;重新安装应用程序,我们也可以从Keychain中读取这些数据。
NSManagedObjectModel对应数据模型,即上篇博客中我们创建的.xcdatamodeld文件;NSPersistentStoreCoordinator相当于数据库与数据模型之间的桥接器,通过...NSPersistentStoreCoordinator将数据模型存入数据库;NSManagedObjectContext是核心的数据管理类,开发者通过操作它来执行对数据的相关操作。...,例如上次我们创建的班级实体模型,一个实体模型中可以添加许多属性与关系,NSEntityDescription对象中存放这些信息,常用如下: //实体所在的模型管理对象 @property (readonly...store error:(NSError **)error; 四、数据对象管理上下文NSManagedObjectContext NSManagedObjectContext是进行数据管理的核心类,我们通过这个类来进行数据的增删改查等操作... *)object; //删除元素 - (void)deleteObject:(NSManagedObject *)object; //回滚一步操作 - (void)undo; //清楚缓存 - (void
活动记录是一种访问数据库中数据的方式.一个数据库的表或者试图被装箱进一个类中;因此,一个对象实例对应表中的一行数据.在创建对象之后,会往表中添加新的一行以保存数据.加载对象时,从数据库中获取信息;当对象更新时...(Editor > Create NSManagedObject Subclass… > Create)子类以更好地管理我们的实体 Core Data的初始化与清理 如果在创建工程之初勾选了使用Core...使用下面方法中的 一种 来初始化 ** MagicalRecord** 类的调用: + (void)setupCoreDataStack; + (void)setupAutoMigratingCoreDataStack...例如,如果我们有一个Person实体对象,并且我们需要设置它的firstName和lastName字段,下面的代码展示了如何使用MagicalRecord来设置一个后台保存的上下文对象: // 获取上下文环境...我们在Core Data中接触的三类最重要的对象-实体,属性和属性,都有需要在用户info键组配置的选项: 属性 键 类型 目的 attributeValueClassName String 待定 dateFormat
领取专属 10元无门槛券
手把手带您无忧上云