2013-08-21 50 views
0

我有三個實體核心數據一對多記錄插入錯誤

Forms{ 
    name:string 
    jobs<-->>JSAjobs.form 
} 

JSAjobs{ 
    name:string 
    form<<-->Forms.jobs 
} 

Jobs{ 
    step:string 
    jobs<<-->Forms.jobs 
} 

我收到此錯誤:

to-many relationship fault "jobs" for objectID 0x95afe60. . . fulfilled from database. Got 0 rows

現在我保存表單實體的行首後來我需要獲取在表格實體的最後一條記錄上JSAjop創建JSAjobs與細節的新行旁邊似

感謝

NSMutableArray *jobData = [[NSMutableArray alloc]initWithArray:controller.jobData]; 
NSManagedObjectContext *context = [self managedObjectContext]; 


NSError *error; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"JSAform" inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 

NSPredicate *testForFalse = [NSPredicate predicateWithFormat:@"emailed == NO"]; 

[fetchRequest setPredicate:testForFalse]; 

NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 

NSLog(@"Fetched Rows: %i", [fetchedObjects count]); 

//NSManagedObject *existingParent= //... results of a fetch 
JSAform *lastForm = [fetchedObjects objectAtIndex:0]; 

JSAjobs *newJobs = [NSEntityDescription insertNewObjectForEntityForName:@"JSAjobs" inManagedObjectContext:context]; 
// Setting new values 
newJobs.jobType = [NSString stringWithFormat:@"%@", [jobData objectAtIndex:0]]; 
newJobs.jobName = [NSString stringWithFormat:@"%@", [[[jobData objectAtIndex:1]objectAtIndex:0] objectAtIndex:0]]; 
newJobs.comments = [NSString stringWithFormat:@"%@", [[[jobData objectAtIndex:1]objectAtIndex:0] objectAtIndex:1]]; 
newJobs.date = [NSDate date]; 
[newJobs setValue:lastForm forKey:@"form"]; 

if (![context save:&error]) { 
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
} 

//New SOP Value 
JOBsop *jobSOP = [NSEntityDescription insertNewObjectForEntityForName:@"JOBsop" inManagedObjectContext:context]; 
for (int i = 0; i< [[jobData objectAtIndex:1]count]; i++){ 
    NSLog(@"Value for key: %i", i); 
    if (i > 0){ 
     for (int k = 0; k< [[[jobData objectAtIndex:1]objectAtIndex:i] count]; k++){ 

      jobSOP.step = [[[jobData objectAtIndex:1]objectAtIndex:i] objectAtIndex:k]; 
      [jobSOP setValue:newJobs forKey:@"jobs"]; 
     // [NSNumber numberWithInt:[txtBoots.text integerValue]]; 
     NSLog(@"Simple key: %@", [[[jobData objectAtIndex:1]objectAtIndex:i] objectAtIndex:k]); 
     } 
    } 
} 
if (![context save:&error]) { 
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
} 
enter code here 
+0

對不起,我有關係的僞代碼錯誤 – Jose

+0

對不起,我有關係的錯誤僞代碼是這樣的 表格{名稱:字符串作業<-->> JSAjobs.form} JSAjobs {name:string steps <-->> jobsDetail.jobs}謝謝 – Jose

回答

0

你的實體很混亂,因爲你沒有選擇可用的實體名稱。你太困惑,不能親自佈置這些簡單的關係。這會導致混淆的代碼,並且不允許您以結構化的方式思考問題。

您的代碼完全不可理解。你有一個數據數組,儘管有一個獲取的結果控制器(假定)。你的代碼的第二部分體現了一個神祕而神祕的新實體JOBsob。沒辦法,你可以問這樣一個有意義的問題,更不用說得到答案。

你有沒有任何類型檢查的嵌套數組,這些檢查將被破壞並且以任何方式完全不可能調試。擺脫所有這些。

儘管如此,我們的五個一試,讓你開始:

首先,它沒有什麼意義要用複數的實體名稱。如果實體代表「表格」,則應該是Form而不是Forms

也許你想這樣設置:

Form <<----> Job <----->> JobDetail 

一個作業有多種形式和許多工作細節。所以表格有一個關係job,而工作關係forms。同樣,Jobdetail的關係爲job,而Job的關係爲details

當你有一個表單並創建一個新的工作,你只能分配一個工作。因此,舊工作(如果有的話)關係將被打破。

oldForm.job = newJob; 

這是分配關係更安全的方法。當然,你爲這個目的創建了這些實體的NSManagedObject子類。

但是,如果Job和Form之間的關係在一個方向上是一對多關係,那麼你的方案應該是這樣的。

Form <---->> Job <------>> JobDetail 

我真的不現在什麼是「形式」將意味着在這種情況下 - 我只是將其重命名爲Project清晰。

Project <---->> Job <------>> JobDetail 

現在你可以指定一個新的工作給項目和鏈接這樣的其他關係:

newJob.project = existingProject; 
newJobDetail.job = newJob; 
+0

我不得不說**非常感謝**的解釋,我重新組織了結構正如你所建議的,一切正常rfect。 – Jose