Tag: nsmanagedobjectcontext

创build单独的NSManagedObjectContext时出错

在进入我的问题之前,请看看这个图像。 这里是实际的数据模型: 我从Web API中检索一组logging,从中创build对象,将它们保存在核心数据中,并显示在“今日”视图中。 默认情况下,这些logging是针对当前date返回的。 用户可以点击“过去”button转到单独的视图,他可以从dateselect器视图中select过去或将来的date,并查看该选定date的logging。 这意味着我必须再次调用API来传递选定的date,检索数据并将这些数据保存在核心数据中并显示出来。 当用户离开这个视图时,这个数据应该被丢弃。 这是重要的一部分。 即使我得到一组新的数据,“今日”视图中当前date的旧原始数据也不能消失。 因此,如果/当用户返回到“今日”视图时,该数据应该在离开时立即可用,而无需应用程序调用API并再次获取当前date的数据。 我想创build一个单独的NSManagedObjectContext来保存这些临时数据。 我有一个名为DatabaseManager的单独的类来处理核心数据相关的任务。 这个类用`NSManagedObjectContext的实例初始化。 它在给定的上下文中创build托pipe对象类。 import CoreData import Foundation import MagicalRecord import SwiftyJSON public class DatabaseManager { private let context: NSManagedObjectContext! init(context: NSManagedObjectContext) { self.context = context } public func insertRecords(data: AnyObject, success: () -> Void, failure: (error: NSError?) -> Void) { let json = […]

目标c – 核心数据保存方法

我的应用程序中有一些NSManagedObject子类,我试图了解何时以及如何保存更改。 我将尝试解释我自己,例如类A是NSManagedObject子类。 在应用生命周期中,我会: App launched … Create an instance of class A … Change some properties of A instance … App go to background … App becomes active again … Change some more properties of A instance … App terminates 我什么时候需要调用[context save:]? 在A实例的每次更改之后都要调用它吗? 或者,也许我只有当应用程序去背景调用它? 我应该在创build或删除任何一个实例之后调用它吗?

无法创buildexternalDataReference临时文件

我在我的iOS项目中使用核心数据。 我以下面的方式使用多个上下文。 我有一个persisent store context ,在一个私有队列上运行,并将更改存储在持久存储中。 我有一个main queue context是persistent store context的孩子。 我的应用程序中的所有FRC使用此上下文。 最后,如果我必须做一些我希望在批处理中保存的更改,我创build并使用作为主队列上下文的子项的新NSManagedObjectContext 。 所以我有一个链: DB < persistent store context < main queue context < any other child contexts 我有一个保留persistent store context和main queue context的单例。 这个单例还会监听persistent store context NSManagedObjectContextObjectsDidChangeNotification通知,并对通知作出如下反应: -(void) persistentStoreContextDidChangeNotification:(NSNotification*)notification { if (notification.object == self.persistentStoreContext) { [self.persistentStoreContext performBlockAndWait:^{ //on every change on persistentStoreContext, save those […]

从asynchronousWeb服务响应更新托pipe对象的最佳方法?

我有一个NSManagedObjectContext关联到主线程( mainContext ),在那里我获取我显示整个应用程序的所有NSManagedObject 。 用户不要编辑这些对象,但我从Web服务获取更新。 我定期对这些服务执行asynchronous调用,并且“告诉”我要删除哪些pipe理对象(如果有的话),哪些必须用新信息更新(如果有的话),以及是否需要插入新的对象。 所以,我需要首先获得所有服务的响应,然后检查我必须对我的mainContext已有的托pipe对象所做的更改。 而且我还需要执行更新以避免阻止UI。 我正在考虑两种方法来pipe理这种情况: 在私有队列中使用一个完全独立的privateContext和它自己的核心数据栈来插入所有从服务中获得的对象。 然后以某种方式(如何?)与mainContext的对象进行比较,并删除/修改/插入mainContext对象。 在专用队列中使用privateContext ,但是作为mainContext的子mainContext 。 然后,我需要传递子对象的父对象mainContext中的对象(这是可能的?如何?),同时在这个子对象中插入从服务获得的对象,然后比较和执行更改。 哪些方法是最好的或适当的? 或者,也许应该是一个我没有想过的不同的? 提前致谢 编辑:这可能是另一种可能的方式? 只使用mainContext ,而我正在parsing服务的响应,而不是创build新的对象,只需要在mainContext逐一进行更改… 编辑2:另一种可能性? 只有使用privateContext ,获取服务响应并创build新的对象。 然后,也可以用这个privateContext获取所有已经存在的对象(和mainContext的对象一样)。 在这个privateContext比较两组对象(最近创build的服务和获取的),保存此上下文,清除mainContext并重新获取mainContext所有对象。

Coredata performBlock然后返回新的值

如果我使用performBlock保存managedObjectContext,如何返回保存在coredata中的新对象? 要求是,在coredata中添加一个条目,并将其返回。 我的代码是这样的: //create a privateMOC NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; //set parentContext [private setParentContext:self.coredataManager.managedObjectContext]; __block Detail *object = nil; [private performBlock:^{ //fetch from the db object = [self.coredataManager insertObjectWithEntityName:NSStringFromClass([Detail class])]; //save the private context NSError *error = nil; if (![private save:&error]) { NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]); } }]; return […]

核心数据inheritancevs无inheritance

我有核心数据的一些问题,所以我希望有人能够帮助我:) 第一个问题,我有一个数据模型,看起来像这样: Entity P (A) <—-> Entity R / | \ / /\ \ / / | \ \ CDEFG 我所有的实体都从同一个实体“P”inheritance,因为它们需要一个共同的属性和一个共同的关系(“A”和“R”) 我得到的问题是,当您使用inheritance时,核心数据使用只会为所有实体生成一个sqlite表。 在我的情况下,这意味着我的数据库将只有一个表的所有数据。 我做了一些研究,我发现它造成了性能问题(此外,我所有的实体属性都是瞬态的,在willSave中,它们的值被聚合到一个存储在“A”中的NSData中,所以我不能使用谓词来过滤并提高SELECT性能)。 所以我决定删除“P”,并把“A”join“C”,“D”…,“G”。 问题是与“R”,因为之前我只有一个反向关系,现在我需要创build一个每次我创build一种新的实体。 所以我想删除所有的逆关系,这是可能的吗? 有时我需要创build一个没有上下文的托pipe对象,我将它们插入到上下文中,这可能是为什么反向关系不是由核心数据自动设置的,如果在插入MOC之前设置了非反转权限? 无论如何,我从来不需要反过来,所以即使我得到一个警告,我可以避免定义它们吗? 第二个问题,在特定的情况下,我需要创build一个新的“R”,并在MOC保存期间将其分配给“C”,“D”,..,“G”。 所以我想使用willSave,但是,我不知道创build的实体是否会被保存。 如果MOC在“insertedObjects”/“updatedObjects”/“deletedObjects”上做一个简单的循环,并且对于它调用的每个对象将保存,然后调用didSave,这意味着我要修改数组它正在迭代,然后它应该崩溃没有?

Core-Data executeFetchRequest在后台线程中冻结App

我有一个saveMOC的直接父母的mainMOC ,我需要在线获取另一个tmpMOC为了不阻止我的用户界面,同时从互联网上获取大量的logging。 我的应用程序冻结。 我可以缩小到这一点: fetchedItems = [tmpMOC executeFetchRequest:fetchRequest error:&error]; 我试图把这封装在dispatch_sync , [moc.parentcontext.parentcontext.persistentStoreCoordinator lock/unlock] , [whatevermoc performBlockAndWait] … 我也试图取出_mainMOC …没办法… 我明白, executeFetchRequest是不是线程安全的,所以,我怎么locking我需要locking,以确保我没有插入一个双? 任何人都可以帮忙? 更新(1) AppDelegate中的_saveMOC实例: – (NSManagedObjectContext *)managedObjectContext { if (_mainMOC != nil) { return _mainMOC; } if (_saveMOC == nil) { NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _saveMOC = [[NSManagedObjectContext alloc] […]

核心数据不保存可转换的NSMutableDictionary

我有两个类:configuration文件和configuration。 configuration文件包含Config对象的NSSet。 Profile和Config都是NSManagedObject子类。 @interface Profile : NSManagedObject @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSSet *configs; – (void)print; @end 这是Config类 @interface Config : NSManagedObject @property (nonatomic, retain) NSString * otherdata; @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSMutableDictionary *myDict; @property (nonatomic, retain) Profile *profile; – (void)print; @end 字典myDict有NSString *键和值。 现在,当我对myDict进行任何更改时,我调用NSManagedObject保存方法,并且没有错误地正常工作。 只要我不杀应用程序,一切都按预期行事。 […]

用CoreData执行乘法(聚合):如何?

在Jeff Lamarche的一个奇妙的教程之后,我试图为NSManagedObject的特定子类聚合数据。 这是情况。 我创build了一个名为Product的类来扩展NSManagedObject类。 Product类有三个属性,如下所示: @property (nonatomic, retain) NSString* name; @property (nonatomic, retain) NSNumber* quantity; @property (nonatomic, retain) NSNumber* price; 我也创build了一个名为Product+Aggregate的类别,在这里我执行一个总和聚合。 特别是在Jeff教程之后,我pipe理了数量属性的总和。 +(NSNumber *)aggregateOperation:(NSString *)function onAttribute:(NSString *)attributeName withPredicate:(NSPredicate *)predicate inManagedObjectContext:(NSManagedObjectContext *)context { NSString* className = NSStringFromClass([self class]); NSExpression *ex = [NSExpression expressionForFunction:function arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:attributeName]]]; NSExpressionDescription *ed = [[NSExpressionDescription alloc] init]; [ed setName:@"result"]; [ed setExpression:ex]; […]

核心数据multithreading读取logging

我对coredata中的multithreading有一个疑问。 如果我们使用multithreading,我们应该使用单独的NSManagedObjectContext来插入新的数据或更新,否则我们可以使用父子上下文方法。 但是我只创build新的NSManagedObjectContext。 我的问题是,我应该使用单独的NSManagedObjectContext甚至在后台线程中获取也。 如果没有(即我们可以使用主队列NSManagedObjectContext),为什么即时获取__psynch_mutexwait错误。 谢谢,