2011-03-19 108 views
0

我一直在看這一段時間,但似乎無法破解它。它是我在CoreData中建立的第一個多對多關係,顯然有一些簡單的我缺少...保存循環刪除多對多CoreData關係的一端

我有一個屏幕,我維護兩個不同的核心數據'實體',實體通過多對多的關係。第一個實體以及第一個和第二個實體之間的關係保持在屏幕的第一個選項卡上,這似乎工作正常,允許我刪除第一個實體實例並添加/刪除第一個和第二個實體之間的關係。

我的問題是在我維護第二個實體的第二個選項卡上。他們的實體顯示正常,我可以更新他們的屬性,但是試圖刪除它們會導致一個永無止境的保存循環。

我相信我通過在第二個實體的NSManagedObject類的willSave方法中添加一個NSLog條目來驗證循環。

實體顯示在NSArrays支持的NSTableViews中(我沒有使用綁定)。 我分享一個managedObjectContext兩個選項卡和刪除操作簡便之間(見下文):

int currentRow = [[tableView selectedRowIndexes] firstIndex]; 
NSManagedObject *targetObject = [self.array objectAtIndex:currentRow]; 
NSError *error = nil; 
[managedObjectContext deleteObject:targetObject]; 
if (![managedObjectContext save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

希望有人能幫助... ...

問候

斯科特

+0

這裏沒有太多東西可以繼續。嘗試在發生錯誤時發佈一些關於您的環境的更多信息,如果它是無限循環使用shark或'sample'命令來獲取跟蹤。作爲最後的手段,請完整發布您的代碼。 – ImHuntingWabbits 2011-03-19 19:59:38

回答

0

這裏並不是很多,但請檢查您的刪除規則。

如果雙方都設置爲delete的多對多關係,則刪除一個對象可以引發級聯刪除,因爲刪除一個對象會觸發刪除其所有相關對象,從而刪除所有相關對象對象等。

如果您定製了willSavewillTurnIntoFault或類似的方法,那麼您可能在該代碼中也引入了循環。

+0

非常感謝您的回覆......對於細節缺乏道歉,但我從應用程序中看不到太多內容,代碼(我認爲)非常標準。 – 2011-03-19 22:06:49

+0

感謝您的回覆...雙方的關係被設置爲刪除規則:Nullify。就在這時我試圖讓'實體2'一方刪除規則:沒有行動,但它沒有幫助。添加到willSave中的唯一代碼是NSLog,它證明它正在進入循環,現在我已經刪除了它。我想提供一些更多的信息給你們,但我不知道如何得到它......我試着@ImHuntingWabbits提到的示例命令(也感謝您的評論),但我不明白是什麼導致循環...發佈該文件內容的最佳方式是什麼? – 2011-03-19 22:22:55

+0

好的,所以關於幕後發生的事情的一些更多信息...我用SQLDebug選項運行我的應用程序,它顯示刪除正在回滾,然後再次嘗試(刪除日誌文件日期和時間):CoreData:sql: BEGIN EXCLUSIVE CoreData:sql:DELETE FROM ZSYMPTOM WHERE Z_PK =? AND Z_OPT =? (9)ORDER BY Z_PK CoreData:annotation:sql執行時間:0.0012s CoreData:sql:ROLLBACK – 2011-03-19 23:20:24

1

OK,所以它結束了簡單的(我的錯:)

我應該提到,我一直在使用該數據已經加載到使用一個單獨的數據加載腳本(我所生成的文件SQLite3的」使用來自各種來源的數據)。

我添加了一些記錄,其中沒有包含Z_OPT的值,CoreData在刪除這些記錄時失敗(然後重複嘗試刪除)。

一旦我填充Z_OPT一切正常。 我想我會讓CoreData從現在開始管理對數據庫的所有更改:)

再次感謝@TechZen和@ImHuntingWabbits的回覆。

+1

由於核心數據架構沒有記錄,所以它是非常危險的嘗試直接生成SQLite存儲。正確的做法是棘手的,即使你這樣做了,蘋果也許會在沒有警告的情況下更改架構。 – TechZen 2011-03-20 23:31:07