1.没有线程安全的coredata数据读取: NSManagedObjectContext对象的创建: _managedObjectContext = [[NSManagedObjectContext alloc] init]; 2.线程安全的coreData操作: 1,创建并行的NSManagedObjectContext对象: [[NSManagedObjectContext alloc] (表示可以在子线程中执行) 在主线程,主要执行插入,修改和删除操作,一些小的查询也可以在这里同步执行,如果有大的查询,就起一个新的 NSPrivateQueueConcurrencyType 类型的 NSManagedObjectContext NSManagedObject 也不能跨线程访问,所以在block里获取到的NSManagedObject对象只能将objectid传到主线程,主线程再通过 objectWithID 恢复对象的方法 2,NSManagedObjectContext
NSManagedObject操作的上下文,NSManagedObject的操作会先缓存在上下文中,还未存到磁盘中 - (NSManagedObjectContext *)managedObjectContext 为自己的父级,这个时候子级可以访问父级下所有的对象,而且子级 NSManagedObjectContext 的内容变化后,如果执行save方法,会自动的 merge 到父级 NSManagedObjectContext 中,也就是子级save后,变动会同步到父级 NSManagedObjectContext。 ,而NSManagedObjectContext可以共享一个NSPersistentStoreCoordinator或者,每个NSManagedObjectContext都对应一个NSPersistentStoreCoordinator *current_context = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext
= nil) { // 创建NSManagedObjectContext对象 _managedObjectContext = [[NSManagedObjectContext 4.Core Data数据的增删查改 获取托管对象上下文NSManagedObjectContext之后,接下来即可通过该对象来执行增、删、查、改操作。 该方法的第1个参数为实体名,第2个参数为NSManagedObjectContext对象。为新实体设置属性。调用NSManagedObjectContext对象的save:方法执行保存。 最后调用NSManagedObjectContext对象的save:方法执行保存。 管理下的实体;然后修改实体的属性;再调用NSManagedObjectContext对象的save:方法执行保存。
,在此之前要注意下图两个设置部分,否则会引起崩溃现象 [注意1.png] [注意2.png] [创建实体类.png] [创建实体类.gif] [实体类的四个文件.png] 4、生成上下文 关联数据库 NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 封装了应用程序中的CoreData Stack(核心数据栈堆),简化了创建和管理的核心堆栈的数据处理创建NSManagedObjectModel,NSPersistentStoreCoordinator,NSManagedObjectContext - (void)performBackgroundTask:(void (^)(NSManagedObjectContext *))block; 5.增删改查排 写入数据 // 1.根据Entity 名称和NSManagedObjectContext获取一个新的继承于NSManagedObject的子类Student Student * student = [NSEntityDescription
下面是一个简单的例子,具体含义下文都会提到: // 获取上下文环境 NSManagedObjectContext *localContext = [NSManagedObjectContext 默认上下文 当使用Core Data时,你经常使用的连两类主要对象是: NSManagedObject和 NSManagedObjectContext. 为了获取默认上下文,调用: NSManagedObjectContext *defaultContext = [NSManagedObjectContext MR_defaultContext]; 这个上下文对象 如果你想创建一个新的对象管理上下文对象,以用于非主线程,可使用下面的方法: NSManagedObjectContext *myNewContext = [NSManagedObjectContext 在你的block内部提供一个单一的 NSManagedObjectContext 上下文对象.
的deleteObject:方法删除数据 查:利用NSManagedObjectContext的executeFetchRequest:error:方法,查询数据 保存:利用NSManagedObjectContext 说是一个对象的集合,由4个主要对象构成: 「managed object context」 (NSManagedObjectContext), 「persistent store coordinator NSManagedObjectContext类实例。 备注:对数据进行删除、保存、查询,都要用到NSManagedObjectContext类的相关方法。 对应示意图第3个框框。 对象,是通过上面创建的NSPersistentContainer对象的属性viewContext获取的,无需自己初始化(iOS10之前要自己初始化) NSManagedObjectContext 4、删 删除数据比较简单,直接调用NSManagedObjectContext的deleteObject:方法即可。
实体类的四个文件.png 4、生成上下文 关联数据库 NSManagedObjectContext 管理对象,上下文,持久性存储模型对象,处理数据与应用的交互 NSManagedObjectModel *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 封装了应用程序中的CoreData Stack(核心数据栈堆),简化了创建和管理的核心堆栈的数据处理创建NSManagedObjectModel,NSPersistentStoreCoordinator,NSManagedObjectContext - (void)performBackgroundTask:(void (^)(NSManagedObjectContext *))block; 5.增删改查排 写入数据 // 1.根据Entity 名称和NSManagedObjectContext获取一个新的继承于NSManagedObject的子类Student Student * student = [NSEntityDescription
你可能会采取批处理的方式,即一小批一小批的更新 NSManagedObject 并保存到 NSManagedObjectContext 中,但这样会花费很多时间,用户体验较差。 然后刷新 NSManagedObjectContext 对应的数据和UI界面,还需要保证更新后的数据满足数据库模型上的 validation ,因为 NSManagedObjectContext 没有感知 也即是说虽然是异步抓取,其实我们用的还是以前的 NSFetchRequest ,当 NSFetchRequest 抓取结束后会更新 NSManagedObjectContext ,这也就意味着NSManagedObjectContext ,这个方法在 NSManagedObjectContext 上执行时, NSManagedObjectContext 会立即制造并返回一个NSAsynchronousFetchResult ,同时 NSAsynchronousFetchRequest 的 finalResult 属性,更新NSManagedObjectContext ,执行 NSAsynchronousFetchRequest 的回调block。
4,NSManagedObjectContext 参与对数据进行各种操作的整个过程,它持有 Managed Object。我们通过它来监测 Managed Object。 5.3.2 示例代码 5.3.2.1 Context初始化 - (NSManagedObjectContext*)getLargeWriteManageObjectContext { NSManagedObjectContext 也即是说虽然是异步抓取,其实我们用的还是以前的 NSFetchRequest ,当 NSFetchRequest 抓取结束后会更新 NSManagedObjectContext ,这也就意味着NSManagedObjectContext ,这个方法在 NSManagedObjectContext 上执行时, NSManagedObjectContext 会立即制造并返回一个NSAsynchronousFetchResult ,同时 NSAsynchronousFetchRequest 然后刷新 NSManagedObjectContext 对应的数据和UI界面,还需要保证更新后的数据满足数据库模型上的 validation ,因为 NSManagedObjectContext 没有感知
【二】各种类作用的介绍 创建Core Data Stack iOS10中利用NSPersistentContainer iOS10之前涉及NSManagedObjectContext、NSPersistentStoreCoordinator *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; (并且已经帮我们创建了.xcdatamodeld模型文件) 注意看saveContext,我们通过NSPersistentContainer的属性viewContext拿到NSManagedObjectContext 对象(_context是声明在.h文件的属性——因为其他类也要用到这个属性)) _context = [[NSManagedObjectContext alloc] initWithConcurrencyType *localContext = [NSManagedObjectContext MR_context]; // 在当前上下文环境中创建一个新的 Person 对象.
例如,下面是从 ModelContext 中提取 NSManagedObjectContext 的代码示例: public extension ModelContext { // Computed property to access the underlying NSManagedObjectContext var managedObjectContext: NSManagedObjectContext NSManagedObjectContext else { return nil } return managedObjectContext 利用 NSManagedObjectContext 实现分组计数 在某些场景下,我们需要对数据进行分组后计数,比如统计不同出生年份的学生人数。 有了 SwiftDataKit,我们可以直接使用 ModelContext 底层的 NSManagedObjectContext,通过创建 NSExpressionDescription,在 SQLite
欢迎大家在 Discord 频道[2] 中进行更多地交流 用串行队列来避免数据竞争 我们经常说,Core Data 中的托管对象实例(NSManagedObject)和托管对象上下文(NSManagedObjectContext container.performBackgroundTask{ context in ... } 然而,SwiftData 对 ModelContext( NSManagedObjectContext NSManagedObjectContext + 地址 的私有串行队列,Actor 的执行队列与其一致。 可以将其视为 Core Data NSManagedObjectContext 的 existingObject(with:) 方法的对应版本。 registeredModel(for:) 对应于 NSManagedObjectContext 的 registeredObject(for:) 方法;model(for:) 对应于 NSManagedObjectContext
其实这个东西在一篇的时候提到过,不信您看:Swift实践:使用CoreData完成一个通讯录存储 一个基本的 Core Data 栈由四个主要部分组成:托管对象 (NSManagedObject),托管对象上下文 (NSManagedObjectContext 心酸~~~~ 2.1 iOS9 在iOS9中,CoreData Stack的三个核心类是这样的: -管理对象上下文NSManagedObjectContext 对象模型NSManagedObjectModel Step1:搞一个NSPersistentContainer出来 Step2:创建CoreData Stack Step3:别忘了还有一个NSManagedObjectContext Step4:提供一个保存数据的方法 error\(error)") } }) return container }() lazy var managedContext: NSManagedObjectContext
addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:path options:nil error:nil]; NSManagedObjectContext * moc = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType]; [moc
例如,下面是从 ModelContext 中提取 NSManagedObjectContext 的代码示例: public extension ModelContext { // Computed property to access the underlying NSManagedObjectContext var managedObjectContext: NSManagedObjectContext NSManagedObjectContext else { return nil } return managedObjectContext 利用 NSManagedObjectContext 实现分组计数 在某些场景下,我们需要对数据进行分组后计数,比如统计不同出生年份的学生人数。 有了 SwiftDataKit,我们可以直接使用 ModelContext 底层的 NSManagedObjectContext,通过创建 NSExpressionDescription,在 SQLite
在 Core Data 中,我们可以创建两种类型的托管对象上下文(NSManagedObjectContext)——主队列上下文和私有队列上下文。 其中,开发者接触最频繁、使用量最大的托管对象上下文(NSManagedObjectContext)和托管对象(NSManagedObject)恰好都不是线程安全的。 但是,对于私有上下文,由于队列是私有的,只存在于 NSManagedObjectContext 实例的内部,因此只能通过perform或performAndwait方法来调用它。 ])} 也可以使用 NSManagedObjectContext 实例的 mergeChanges 方法,逐个上下文合并。 在 iOS 10 版本,Core Data 为 NSManagedObjectContext 添加了 automaticallyMergesChangesFromParent 属性。
xcdatamodeld文件;NSPersistentStoreCoordinator相当于数据库与数据模型之间的桥接器,通过NSPersistentStoreCoordinator将数据模型存入数据库;NSManagedObjectContext 移除一个持久化的数据接收对象 - (BOOL)removePersistentStore:(NSPersistentStore *)store error:(NSError **)error; 四、数据对象管理上下文NSManagedObjectContext NSManagedObjectContext是进行数据管理的核心类,我们通过这个类来进行数据的增删改查等操作。
Core Data架构 一个基本的 Core Data 栈由四个主要部分组成:托管对象 (NSManagedObject),托管对象上下文 (NSManagedObjectContext),持久化存储协调器 这些对象都保存在NSManagedObjectContext中,每个存储对象都知道自己对应哪个上下文。 NSManagedObjectContext :日常打交道的都是这个。
addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:path options:nil error:nil]; //创建数据管理上下文 NSManagedObjectContext * moc = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType]; //关联持久化协调者
objectAtIndexPath:indexPath]; AppDelegate *appDelegate = [UIApplication sharedApplication].delegate; NSManagedObjectContext