2013-07-28 57 views
4

我有一個帶有以下接口的NSManagedObject。核心數據可可錯誤1570.無法保存多個實體對象

@class Organization, Person; 

@interface Assistance : NSManagedObject 
@property (nonatomic, retain) NSDate * date; 
@property (nonatomic, retain) Organization *organization; // Not optional, 1 to 1 
@property (nonatomic, retain) NSSet *persons; // 1 to many 
@end 

人與組織有1-1關係。 協助與組織有1-1的關係與Person有1-may關係。

我第一次嘗試保存輸入時,它完美地工作,但不是第二次。

案例情景:我添加一個實體,日期2013-07-26 00:00:00 +0000,其各自的組織和人員。

我重新啓動應用程序。它執行搜索當前日期(7/27)並且沒有找到任何東西。我開始編輯應用程序中的東西,因此它使用MagicalRecord的便捷方法創建了一個新實體[Assistance createEntity];我立即設定日期(7/27)和組織。 Person對象被添加或刪除。當選擇另一個日期,我儘量保存當前援助對象實體,爲了這個,我已經實現了setCurrentDate方法自己:

- (void)setCurrentDate:(NSDate *)currentDate 
{ 
    if (assistanceWasChanged) { 
     NSLog(@"> > > Has changed, need to save with Persons {%i}, org {%@}, date {%@}", [self.assistance.persons count], self.organization.name, self.currentDate); 
//  [[NSManagedObjectContext defaultContext] saveOnlySelfWithCompletion:^(BOOL success, NSError *error) { NSLog(@"> > > 01:Assistance saved?"); }]; 
     [[NSManagedObjectContext defaultContext] saveOnlySelfAndWait]; 
    } 
    assistanceWasChanged = NO; 
    _currentDate = currentDate; 
    [self setCurrentAssistance]; // Tries to find Assistance with new date 
} 

但是這一次,它不會保存。我得到一個可可錯誤1570(並非所有必填字段都已填充):

> > > Has changed, need to save with Persons {1}, org {MSF}, date {2013-07-27 00:00:00 +0000} 
2013-07-27 20:23:41.017 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Saving <NSManagedObjectContext (0x8d61e50): *** DEFAULT ***> on *** MAIN THREAD *** 
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Save Parents? 0 
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Save Synchronously? 1 
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x8d61e50) Context DEFAULT is about to save. Obtaining permanent IDs for new 1 inserted objects 
2013-07-27 20:23:41.019 CoreData: sql: BEGIN EXCLUSIVE 
2013-07-27 20:23:41.019 CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ? 
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ? 
2013-07-27 20:23:41.020 CoreData: sql: COMMIT 
2013-07-27 20:23:41.021 +[MagicalRecord(ErrorHandling) defaultErrorHandler:](0x6b3a0) Error: <Assistance: 0x9cb16c0> (entity: Assistance; id: 0x9e5ac00 <x-coredata://15A3-4C6D-4025-9131-3D51048/Assistance/p1> ; data: { 
    date = "2013-07-26 00:00:00 +0000"; 
    organization = nil; 
    persons = "<relationship fault: 0x8d80500 'persons'>"; 
}) 

沒有時間點是組織零。另外,日期'2013-07-26'的對象從未被獲取/編輯。正如我的日誌聲明顯示的,我試圖添加的新對象的日期爲'2013-07-27'。 起初我以爲CoreData有一個指向舊數據的指針,但事實並非如此,插入的第一個日期從未被獲取。 (當我重新啓動應用程序,第一目標(7/26)仍然存在 如果它的確與衆不同,援助實體對象是我實現文件的屬性:

@property (strong, nonatomic) Assistance *assistance; 

我失去的東西關於核心數據? 爲什麼保存一個新的實體對象時,被訪問的第一插入的對象?爲什麼是組織零?

+0

也許顯示創建新對象的代碼,包括您設置組織的部分? – ophychius

+0

還有很多其他地方可能出現問題。這裏的主要問題是我不確定你是否理解上下文的概念。對象與上下文綁定,並且您需要保存上下文以便數據持久化,然後您可以稍後搜索它。在這段代碼中,我沒有看到任何「錯誤」,但我也覺得我沒有全部的圖片來指出問題。 – casademora

+0

@casademora謝謝掃羅!我想相信我理解上下文的想法,但我會再看一次。我的問題是我的3個實體中有2個具有錯誤的關係多樣性。 – Eric

回答

7

看起來你是不是創建一個新的organisation,而是要鏈接的新Assistance反對現存的organisation。因爲關係是1 to 1這意味着舊的Assistance對象與organisation斷開關係。這由Core Data自動完成,以保持您設置的配置的完整性。

因此,要麼創建一個新的organisation對象或改變關係的多樣性。

+0

我想出了什麼問題,但你是對的。我需要改變關係的多樣性。我只是在看援助與組織的關係是「與一個」(這是我關心的關係)之間的關係,但組織與援助之間的關係是「多對多」(核心數據也關心這一點關係,即使我沒有) – Eric

相關問題