2010-04-06 76 views
0

我的應用程序將允許用戶從大量事件列表中創建個性化的事件列表。我有一個簡單地顯示這些事件的表格視圖,點擊其中一個將用戶帶到事件詳細信息視圖,該視圖有一個「添加到我的事件」按鈕。在覈心數據中插入新的關係數據

在此詳細視圖中,我擁有原始事件對象,通過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 

博特產生(在由//錯誤指示的線):

*** -[NSComparisonPredicate evaluateWithObject:]: message sent to deallocated instance 

似乎我可能錯過了一些基本的東西。我無法通過使用調試工具收集更多信息,並瞭解他們的情況。

1)這是一個有效的方式來編譯和存儲這樣的可編輯列表嗎?

2)有沒有更好的方法?

3)什麼可能是錯誤的解除分配的實例?

-

我現在已經修改了事件實體有一個名爲「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() 

解決方案

我設法去的這條底線。

我正在使用NSFetchedResultsControllerNSPredicate來提取有問題的事件,我在發佈結果後發佈了這個消息。從返回的實體中檢索值是沒有問題的,但是當我試圖更新其中的任何一個時,它給出了上述錯誤。它不應該被釋放。

奧斯坦丁我的問題

什麼是一個好辦法,從現有的項目列表中的一個核心數據模型而言,這分名單的一部分。我不相信我在這裏嘗試過的任何方式。我需要在另一個表格視圖中顯示/編輯它。也許有比每個事件實體的布爾屬性更好的方法?上面的關係想法在這裏似乎不起作用(儘管我現在可以創建它)。

乾杯。

+0

爲什麼你需要MyEvents?如果您只是將它用作容器對象,請改用'NSFetchedResultsController'。 – falconcreek 2010-04-06 16:11:53

+0

我認爲你仍然可能不需要一個單獨的實體。您可以創建一個類似於員工 - 經理的直接報告關係的一對多關係。在這種情況下,您可以創建事件 - 收藏夾事件<-->>收藏夾。查看http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/XcodeCoreDataTools/Introduction/Introduction.html – falconcreek 2010-04-08 13:20:20

+0

我嘗試了一些與此有關的事情 - 請參閱有關更新;或許我的模型現在不是最好的,但我不認爲它是我看到的問題的原因。 – michael 2010-04-10 02:26:36

回答

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文檔,瞭解如何使用這些類。

+0

我這樣做,因爲我不使用NSFetchedResultsController,我需要修改數據。我使用NSFetchedResultsController在表視圖中檢索「事件」,然後將此「事件」傳遞給僅與此「事件」有關的另一個視圖控制器。這是我嘗試將其添加到「MyEvents」列表中,如果用戶啓動此操作。 我想在Event實體中可能存在一個屬性,指出這是否構成用戶MyEvents的一部分。儘管我可能想添加更多的信息給「MyEvents」。 – michael 2010-04-07 02:15:57

+0

您是否在我的答案中嘗試了代碼? 查看CoreDataBooks示例代碼並研究RootViewController,DetailViewController和EditingViewController之間的交互。看起來你正在努力實現類似的工作流程。 – falconcreek 2010-04-07 13:55:36

+0

感謝您的幫助和耐心falconcreek。我確實嘗試了您的建議代碼,並更新了我的原始問題。我的確在嘗試一些與示例代碼類似的東西,但我試圖將我已經擁有的信息添加到列表中,而不是添加一個全新的實體。我通過與食譜示例代碼相同的參考。 – michael 2010-04-08 10:05:07

0

我可以看到這是一個古老的問題,所以你可能已經過了這個障礙,但你絕對不需要爲MyEvent單獨的實體。

如果沿着這條路走下去,如果這是您的項目需求,您將不得不做大量的工作來保持事件&我的事件視圖同步。

解決問題的最簡單方法是簡單地向您的Event實體添加一個「收藏」屬性(可以通過UIButton或您喜歡的界面中的任何東西來切換),然後使用NSFetchedResultsController(收藏夾== YES)謂詞來照顧你的My Events視圖。

這樣你只處理一個實體,NSFetchedResultsController將負責在需要時爲你更新視圖。