在核心数据中插入新的关系数据

时间:2010-04-06 12:06:12

标签: iphone iphone-sdk-3.0 core-data

我的应用程序将允许用户从大量事件列表中创建个性化的事件列表。我有一个只显示这些事件的表格视图,点击其中一个会将用户带到事件详细信息视图,其中有一个“添加到我的事件”按钮。

在这个详细视图中,我拥有原始事件对象,通过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。从返回的实体中检索值没有问题,但是当我尝试更新它们中的任何一个时,它给出了上面的错误。它不应该被释放。

我的问题的一部分

根据核心数据模型从现有项目列表创建此子列表的好方法是什么。我不相信我在这里试过的任何方式。我需要在另一个表视图中显示/编辑它。也许在每个事件实体上有比布尔属性更好的方法?上面的关系想法在这里似乎不起作用(即使我现在可以创建它)。

干杯。

2 个答案:

答案 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];

根据我的评论,请考虑为什么要创建新的实体来管理集合。 NSFetchedResultsControllerNSFetchedResultsControllerDelegate协议旨在与tableViews密切合作。有关如何使用这些类的信息,请参阅Apple文档。

答案 1 :(得分:0)

我可以看到这是一个古老的问题,所以你可能已经超越了这个障碍,但你绝对不需要MyEvent的单独实体。

如果你沿着这条路走下去,你将不得不做很多工作来保持活动&amp;如果这是项目的要求,我的事件视图会同步。

解决问题的最简单方法是简单地将“收藏”属性添加到您的Event实体(可以通过UIButton或界面中的任何内容切换),然后使用NSFetchedResultsController和(收藏夹== YES) )谓词来处理你的我的事件视图。

这样您只处理一个实体,NSFetchedResultsController将在需要时为您更新视图。