2013-05-27 12 views
0

我第一次使用Coredata,我將一些值設置爲userinfo實體,從usergroups實體中提取一些值。應用程序崩潰在coredata中的對象ID爲它的主鍵字段

,而這樣做的過程我的申請得到墜毀說:

「以前未分配的對象ID爲它的主鍵 場,這是用於獲得核心數據 對象的永久ID項目。在調用保存managedObjectContext之前,請確保 指定了一個對象ID。

這看起來有點像

[newManagedObject setValue:[newManagedObject assignObjectId] forKey:[newManagedObject 
primaryKeyField]] 

。有問題的產品:

<Userinfo: 0x10695b30> (entity: Userinfo; id: 0x10695b70 <x-coredata://18875EDC-D300-4D63-90FC-181B2487599D-3229-000024DF842CC304/Userinfo/tA6216695-816F-4379-B24C-984AAFD1A8342>; data: 

//讀取值的&修改

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Userinfo" inManagedObjectContext:context]; 
    [fetchRequest setEntity:entity]; 
    NSPredicate *datapredicate = [NSPredicate predicateWithFormat:@"username == %@",usermobileNumber]; 
    [fetchRequest setPredicate:datapredicate]; 

    [context executeFetchRequest:fetchRequest onSuccess:^(NSArray *results){ 
     NSLog(@"results %@",[results valueForKey:@"firstname"]); 
     userinfoObject = [results objectAtIndex:0]; 
     NSLog(@"userinfo %@",userinfoObject); 
//  userinfoObject = [[Userinfo alloc]initWithEntity:[NSEntityDescription entityForName:@"Userinfo" inManagedObjectContext:context] insertIntoManagedObjectContext:context]; 

     [userinfoObject setValue:[userinfoObject valueForKey:@"firstname"] forKey:@"firstname"]; 
     [userinfoObject setValue:[userinfoObject valueForKey:@"lastname"] forKey:@"lastname"]; 
     [userinfoObject setValue:[userinfoObject valueForKey:@"email"] forKey:@"email"]; 
     [userinfoObject setValue:[userinfoObject valueForKey:@"zipcode"] forKey:@"zipcode"]; 
     [userinfoObject setValue:[userinfoObject valueForKey:@"password"] forKey:@"password"]; 
     [userinfoObject setValue:[userinfoObject valueForKey:@"dateofbirth"] forKey:@"dateofbirth"]; 
     [userinfoObject setValue:[userinfoObject valueForKey:@"username"] forKey:@"username"]; 
     [userinfoObject setValue:[userinfoObject valueForKey:@"salutation"] forKey:@"salutation"]; 
//  [userinfoObject setValue:[userinfoObject assignObjectId] forKey:[userinfoObject primaryKeyField]]; 

//添加值

Usergroups *userGroupsObject = [NSEntityDescription insertNewObjectForEntityForName:@"Usergroups" inManagedObjectContext:context]; 
      [userGroupsObject setValue:contactObject.strGroupName forKey:@"groupname"]; 
      [userGroupsObject setValue:[contactsStack objectAtIndex:i] forKey:@"mobile_contacts"]; 
      [userGroupsObject setValue:usermobileNumber forKey:@"mobile_number"]; 
      [userGroupsObject setValue:[userGroupsObject assignObjectId] forKey:[userGroupsObject primaryKeyField]]; 
      NSError *error = nil; 
      if (![context saveAndWait:&error]) { 
       NSLog(@"There was an error! %@", error); 
      } 
      else { 
       NSLog(@"You created Usergroup object!"); 
      } 
      [userinfoObject addUsergroupsObject:userGroupsObject]; 
+0

'primaryKeyField'方法的作用是什麼?這不是標準的核心數據方法,而且似乎是您遇到麻煩的原因。這個是從哪裏來的? –

+0

@TomHarrington:這與我正在使用的數據庫以及特定的Nsmanaged對象上下文相關,即我將objectId分配給數據庫創建的默認主鍵的usergroups對象。 – iOSDev

+0

好吧,我不太明白你在說什麼,但是如果要用NSManagedObject的objectID來解決問題,你肯定會碰到崩潰和/或數據損壞。 –

回答

3

你應該提供更多的代碼....... ...

一般添加新條目將如下所示

FormField *info = [NSEntityDescription 
        insertNewObjectForEntityForName:@"FormField" 
        inManagedObjectContext:managedObjectContext]; 


[info setValue: @"string data to insert" forKey:@"fieldValue"]; 
NSError *error; 
[managedObjectContext save:&error] 

和檢索的入口看起來像這樣

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"entityName" 
            inManagedObjectContext:managedObjectContext]]; 

NSError *error; 
NSArray* data_ = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
+0

我已添加我的代碼。 – iOSDev

+2

原因是您正在嘗試使用剛創建但尚未保存的核心數據對象的對象ID ...只要您調用保存託管對象上下文,該對象將獲得其ID。 –

+0

或者在該行之前調用save管理對象上下文或者更改邏輯............ –

1

的assignObjectID和primaryKeyField方法擺脫那些誰正在努力,因爲他們是StackMob具體的方法來回答這個問題。它們不直接與核心數據ID進行交互,只是將一個隨機生成的UUID分配給映射到數據庫主鍵字段(StackMob服務器)的屬性。事實上,在調用save之前必須執行此操作,因爲增量存儲實現會使用該字符串ID在重寫的obtainPermanentIDsForObjects:方法中創建永久的Core Data ID。

我的猜測是你有一個託管對象,在它被保存之前,永遠不會爲映射到數據庫主鍵字段的屬性分配一個值。在導致崩潰的保存之前,設置斷點並打印出託管對象上下文的插入對象(即[self.managedObjectContext insertedObjects])。這應該讓你知道什麼對象導致崩潰,並且你可以相應地調整你的代碼。

+0

是的,用戶對象具有空值,msv您對stackmob有什麼想法? – iOSDev

+0

我需要發送一個用戶組對象到一個特定的用戶對象,用戶名是主鍵,我怎麼能實現這個.. – iOSDev

相關問題