我想遍历NSManagedObjectContext中的所有对象,并手动更新它们.然后,应更新每个托管对象.最好的方法是什么?
我在我的iPhone应用程序中使用核心数据.我创建了一个简单的类Friend,它派生自NSManagedObject并使用以下属性:
@property (nonatomic, retain) NSString *name;
Run Code Online (Sandbox Code Playgroud)
我能够在我的上下文中添加和删除此类的实例,并且我的更改也是持久的.
现在我想更新/修改一个Friend -instance并让它再次持久化.
但这似乎不起作用.
这是一段显示我的问题的代码:
// NSManagedObjectContext *context = < my managed context>
// NSFetchedResultsController *nsfrc= < my fetched result controller>
NSEntityDescription *entity = [nsfrc entity];
NSManagedObject *newManagedObject = [NSEntityDescription
insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
Friend *f = (Friend *) newManagedObject;
f.name = @"name1";
//1. --- here context.hasChanges == 1 --- ok
NSError *error = nil;
if (![context save:&error]) { ... }
//2. --- here context.hasChanges == 0 --- …Run Code Online (Sandbox Code Playgroud) 我正在完成我的核心数据应用程序和我开始我的最终测试.
Everyfing工作正常,除了一件事,随机发生,我无法重现它.
这是日志(使用NSZombieEnabled):
2011-07-03 20:27:53.144 MYAPP[1882:707] -[__NSCFType controllerWillChangeContent:]: unrecognized selector sent to instance 0x4a4c490
2011-07-03 20:27:53.149 MYAPP[1882:707] Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFType controllerWillChangeContent:]: unrecognized selector sent to instance 0x4a4c490 with userInfo (null)
2011-07-03 20:27:53.165 MYAPP[1882:707] CoreAnimation: ignoring exception: -[__NSCFType controllerWillChangeContent:]: unrecognized selector sent to instance 0x4a4c490
Run Code Online (Sandbox Code Playgroud)
它在这里崩溃:
NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; // IT'S OK
NSManagedObject *newManagedObject = …Run Code Online (Sandbox Code Playgroud) iphone core-data nsfetchedresultscontroller nsmanagedobjectcontext
好吧,我正在Apple的网站上阅读iOS核心数据教程,但我还是不太明白.
我如何实际获得,NSManagedObjectContext所以我可以用它来访问我的数据库?
我希望每当添加某种类型的实体(并且可能更改/删除)时都会收到通知.
我通过向managedObjectContext添加一个观察者来读取它是可能的.但是,我还没有找到实际的方法.
我在做:
[context addObserver:self forKeyPath:@"{myEntityName}" options:{I have tried several different values, but I am failing to understand which one to use} context:@"NewEntity"];
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.
注意:我显然是coredata/cocoa/objective-c的新手,这可能是非常基本的,但一直在追逐答案.无法找到关于如何正确观察上下文对象的更改的示例和/或解释(我已经能够观察到特定实体的更改而没有问题).
顺便说一句:这是一个类似的问题,表明这是可能的,但我缺乏细节:核心数据:观察某些类型的实体的所有变化
core-data nsnotifications nsmanagedobject nsmanagedobjectcontext
我正在尝试在后台下载一些JSON对象,并且正在进行相当多的多线程.一旦操作完成,我注意到这个断言失败了:
NSAssert([user.managedObjectContext isEqual:[AppUser managedObjectContext]],@"Different contexts");
Run Code Online (Sandbox Code Playgroud)
如何将更改合并到[AppUser managedObjectContext]定义的主上下文中?
你好,有什么区别
[self.context refreshObject:site mergeChanges:YES];
Run Code Online (Sandbox Code Playgroud)
和
[self.context save:nil];
Run Code Online (Sandbox Code Playgroud)
有时我会同时使用它们,有时我只使用它们save.它适用于两种情况.
我有一堆NSOperations需要在队列中运行时创建和获取实体.
在NSOperations中创建实体时,我可以简单地使用默认上下文创建,或者因为我在不在主线程上的新线程中是不允许/建议的?如果我在这个线程上创建一个新实体,那么将它合并回默认上下文然后(而不是保存到商店)的最佳方法是什么?
在获取这些线程时,我需要获取然后更新该实体中的数据.我不知道如何做到这一点然后合并到默认上下文.
或者,当您保存时,您获取/创建的线程真的无关紧要?
我说上面的默认上下文,因为我有NSFetchedResultsControllers监视更新和插入的默认上下文.目前我的解决方案是在主线程上完成所有这些工作,但是应用程序现在开始爬行,现在正在通过它运行大量数据.
我还有一个类监控(通过KVO)操作队列计数.一旦它变为零,我就预先形成一个保存.我宁愿只在完成所有上述NSOperations后执行,就像我现在正在执行的那样.感谢您的帮助.
core-data nsoperation nsmanagedobjectcontext ios magicalrecord
我正在寻找一种方法来跟踪NSManagedObject的属性更改.
目前我使用NSNotifactionCenter来查看我的managedobjectcontext的更改:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDataModelChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.managedObjectContext];
Run Code Online (Sandbox Code Playgroud)
它会触发handleDataModelChange Methode,如下所示:
- (void)handleDataModelChange:(NSNotification *)note
{
NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey];
if (updatedObjects.count > 0) {
for (NSManagedObject *obj in updatedObjects.allObjects) {
NSLog(@"Object updated: %@ with values:",obj.entity.name);
NSDictionary *theAttributes = [self getAllAttributesOf:obj];
for (NSString *attributeName in theAttributes) {
NSLog(@"Name: %@ : %@",attributeName,[obj valueForKey:attributeName]);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果对象发生更改,则会记录该对象的新属性.如何获得获取旧属性值的方法?
core-data objective-c nsmanagedobjectcontext ios magicalrecord