2012-04-04 43 views
2

我有一個使用核心數據的應用程序。我在項目中有兩個數據模型,並通過合併這兩個模型來創建ManagedObjectContext。在這裏,我做的代碼:awakeFromInsert永不叫

- (NSManagedObjectModel *)managedObjectModel { 
    if (__managedObjectModel != nil) { 
     return __managedObjectModel; 
    } 

    NSURL* entityURL = [[NSBundle mainBundle] URLForResource:@"User_data" withExtension:@"momd"]; 
    NSManagedObjectModel* entityModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:entityURL]; 

    NSURL* whoURL = [[NSBundle mainBundle] URLForResource:@"WHO_data" withExtension:@"momd"]; 
    NSManagedObjectModel* whoModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:whoURL]; 

    NSArray* models = [NSArray arrayWithObjects:entityModel, whoModel, nil]; 
    __managedObjectModel = [NSManagedObjectModel modelByMergingModels:models]; 

    return __managedObjectModel; 
} 

在我的實體的屬性都不是可選的,我的應用程序崩潰,當我嘗試保存我的managedObjectContext。我相信這是因爲某些屬性沒有設置。我已覆蓋awakeFromInsert:對於父實體:

- (void) awakeFromInsert 
{ 
    [super awakeFromInsert]; 

    NSString* userCFUUID = [[NSUserDefaults standardUserDefaults]objectForKey:@"device_identifier"]; 

    if (userCFUUID) { 
     [self cfuuid:userCFUUID]; 
    } else { 
     [NSException raise:NSInvalidArgumentException format:@"Entry: awakeFromInsert: cannot find CFUUID"]; 
    } 

    [self setCreationDate:[NSDate date]]; // the time since Jan 1st 1970 in seconds 
    [self setEventDate:[NSDate date]]; 
} 

但是awakeFromInsert:永遠不會被調用。我設置一個斷點,並從那裏我創建NSManagedObject聲明臺階的貫通:

LengthEntry *length1 = [NSEntityDescription insertNewObjectForEntityForName:@"LengthEntry" inManagedObjectContext:moc]; 

其他事實,可能會或可能不會relavent: 創建包含問題的實體數據模型後,我用Xcode的功能自動創建類。然後我意識到,由於我沒有指定在模型中做其他事情,所以xcode命名爲複數意義上的類(因爲這就是我在模型中稱的)。所以,我以「Entries.h」而不是「Entry.h」結束了。我回去並手動更改了所有的類,並在模型中指定了類的名稱。

所以,我需要弄清楚爲什麼awakeFromInsert永遠不會被調用。

回答

1

出於絕望,我刪除了datamodel和NSManagedObject類。然後我重新創建了模型和類。

現在,它工作。當我手動更改類的名稱時,必定會發生某些事情。

+6

我要扔我的2美分,這似乎是典型的情況下,當添加類到編輯器中的實體被遺忘。這確保了自定義實現永遠不會被使用,儘管實體定義足以讓核心數據將您的hud分割成對象存儲。 – Landern 2012-06-26 14:06:26

+1

@摩西,對我來說,確實是忘記爲孩子實體設置班級。謝謝! – phatmann 2013-12-17 15:04:09

1

awakeFromInsert在第一次創建時每個對象只會被調用一次。

你想要的是awakeFromFetch爲了讓它在每次從存儲裝載到內存時調用它。

很多時候,你想在兩個地方使用相同或相似的代碼。