我的应用程序将允许用户从大量事件列表中创建个性化的事件列表。我有一个只显示这些事件的表格视图,点击其中一个会将用户带到事件详细信息视图,其中有一个“添加到我的事件”按钮。
在这个详细视图中,我拥有原始事件对象,通过NSFetchedResultsController
检索并传递给详细视图(通过表格单元格,与核心数据配方示例相同)。我可以从这个“事件”中检索/显示信息。然后我尝试将其添加到由一对多(反向)关系表示的MyEvents
列表中:
alt text http://www.imgplace.com/img580/8008/44relationship.png
此代码:
NSManagedObjectContext *context = [event managedObjectContext];
MyEvents *myEvents = (MyEvents *)[NSEntityDescription insertNewObjectForEntityForName:@"MyEvents" inManagedObjectContext:context];
[myEvents addEventObject:event];//ERROR
此代码(建议如下):
//would this add to or overwrite the "list" i am attempting to maintain
NSManagedObjectContext *context = [event managedObjectContext];
MyEvents *myEvents = (MyEvents *)[NSEntityDescription insertNewObjectForEntityForName:@"MyEvents" inManagedObjectContext:context];
NSMutableSet *myEvent = [myEvents mutableSetValueForKey:@"event"];
[myEvent addObject:event]; //ERROR
Bot产生(在// ERROR指示的行):
*** -[NSComparisonPredicate evaluateWithObject:]: message sent to deallocated instance
似乎我可能错过了一些基本的东西。我不知道如何通过使用调试工具收集更多信息。
1)这是编译和存储像这样的可编辑列表的有效方法吗?
2)有更好的方法吗?
3)错误的解除分配的实例可能是什么?
-
我现在已经将Event实体修改为具有称为“myEvents”的多对多关系,该关系引用自身。我可以将事件添加到此处,并且记录对象会在[event addMyEventObject:event];
之后显示正确的内存地址。然而,在此之后发生了同样的失败。我仍然无法理解出了什么问题。这是回溯
#0 0x01f753a7 in ___forwarding___ ()
#1 0x01f516c2 in __forwarding_prep_0___ ()
#2 0x01c5aa8f in -[NSFetchedResultsController(PrivateMethods) _preprocessUpdatedObjects:insertsInfo:deletesInfo:updatesInfo:sectionsWithDeletes:newSectionNames:treatAsRefreshes:] ()
#3 0x01c5d63b in -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] ()
#4 0x0002e63a in _nsnote_callback ()
#5 0x01f40005 in _CFXNotificationPostNotification ()
#6 0x0002bef0 in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#7 0x01bbe17d in -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] ()
#8 0x01c1d763 in -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] ()
#9 0x01ba25ea in -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] ()
#10 0x01bdfb3a in -[NSManagedObjectContext processPendingChanges] ()
#11 0x01bd0957 in _performRunLoopAction ()
#12 0x01f4d252 in __CFRunLoopDoObservers ()
#13 0x01f4c65f in CFRunLoopRunSpecific ()
#14 0x01f4bc48 in CFRunLoopRunInMode ()
#15 0x0273878d in GSEventRunModal ()
#16 0x02738852 in GSEventRun ()
#17 0x002ba003 in UIApplicationMain ()
溶液
我设法深究这一点。
我使用带有NSFetchedResultsController
的{{1}}来获取有问题的事件,我在获得结果后发布了NSPredicate
。从返回的实体中检索值没有问题,但是当我尝试更新它们中的任何一个时,它给出了上面的错误。它不应该被释放。
我的问题的一部分
根据核心数据模型从现有项目列表创建此子列表的好方法是什么。我不相信我在这里试过的任何方式。我需要在另一个表视图中显示/编辑它。也许在每个事件实体上有比布尔属性更好的方法?上面的关系想法在这里似乎不起作用(即使我现在可以创建它)。
干杯。
答案 0 :(得分:0)
假设您已命名MyEvents <--->> Event relationship as events
MyEvents *myEvents = (MyEvents *)[NSEntityDescription insertNewObjectForEntityForName:@"MyEvents" inManagedObjectContext:context];
NSLog(@"MYEVENTS: %@", myEvents);
NSLog(@"EVENT: %@", event);
// NSMutableSet to hold the events
NSMutableSet *events = [event mutableSetValueForKey:@"events"];
// Add the event to the set. Core Data takes care of the rest
[events addObject:event];
根据我的评论,请考虑为什么要创建新的实体来管理集合。 NSFetchedResultsController
和NSFetchedResultsControllerDelegate
协议旨在与tableViews
密切合作。有关如何使用这些类的信息,请参阅Apple文档。
答案 1 :(得分:0)
我可以看到这是一个古老的问题,所以你可能已经超越了这个障碍,但你绝对不需要MyEvent的单独实体。
如果你沿着这条路走下去,你将不得不做很多工作来保持活动&amp;如果这是项目的要求,我的事件视图会同步。
解决问题的最简单方法是简单地将“收藏”属性添加到您的Event实体(可以通过UIButton或界面中的任何内容切换),然后使用NSFetchedResultsController和(收藏夹== YES) )谓词来处理你的我的事件视图。
这样您只处理一个实体,NSFetchedResultsController将在需要时为您更新视图。