0

Coredata 初めて使用しています。エンティティにいくつかの値を設定し、userinfoエンティティからいくつかの値を取得していますusergroups

このプロセスを実行しているときに、アプリケーションがクラッシュして次のように言っています。

コア データ オブジェクトの永続的な ID を取得するために使用される主キー フィールドのオブジェクト ID が以前に割り当てられていないアイテム。managedObjectContext で save を呼び出す前に、必ずオブジェクト 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];
4

2 に答える 2

1

assignObjectID および primaryKeyField メソッドは、StackMob 固有のメソッドであるため、この質問に答えようとしている人を遠ざけています。コア データ ID と直接対話することはまったくありません。ランダムに生成された UUID を、データベース (StackMob サーバー) のプライマリ キー フィールドにマップされる属性に割り当てるだけです。実際には、save を呼び出す前にこれを行う必要があります。インクリメンタル ストアの実装では、その文字列 ID を使用して、オーバーライドされた getsPermanentIDsForObjects: メソッドで永続的なコア データ ID を作成するためです。

私の推測では、保存する前に、データベースの主キー フィールドにマップされる属性の値が割り当てられない管理対象オブジェクトがあると思います。クラッシュにつながる保存の前に、ブレークポイントを設定し、管理対象オブジェクト コンテキストの挿入オブジェクト ([self.managedObjectContext 挿入オブジェクト]) を出力します。これにより、どのオブジェクトがクラッシュを引き起こしているかがわかるので、それに応じてコードを調整できます。

于 2013-05-28T17:28:21.963 に答える