11

カテゴリ オブジェクトを作成して保存します。

    NSManagedObjectContext *managedObjectContext = [[FTAppDelegate sharedAppDelegate] managedObjectContext];

    _category = (Category *)[NSEntityDescription
                             insertNewObjectForEntityForName:@"Category"
                             inManagedObjectContext:managedObjectContext];

    NSError *error = nil;
    [managedObjectContext save:&error];
    if (error) {
        NSLog(@"error saving: %@",error);
    }

次に、カテゴリ オブジェクトの名前を編集して、再度保存します。

    _category.name = _nameTextField.text;

    NSManagedObjectContext *managedObjectContext = [[FTAppDelegate sharedAppDelegate] managedObjectContext];

    NSError *error = nil;
    [managedObjectContext save:&error];
    if (error) {
        NSLog(@"error saving: %@",error);
    }

次のエラーが表示されます。

 2013-01-12 17:53:11.862 instacat[7000:907] Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn’t be completed. (Cocoa error 134030.)" UserInfo=0x2027b300 {NSAffectedObjectsErrorKey=(
"<Category: 0x1ed43cf0> (entity: Category; id: 0x1ed52970 <x-coredata://68E5D7B6-D461-4962-BC07-855349DB3263-7000-00000141BAB4C399/Category/tE8AB2F2E-C14C-4E93-8343-CC245B7726622> ; data: {\n    categoryId = nil;\n    isPrivate = 0;\n    name = techies;\n    users =     (\n    );\n})"
), NSUnderlyingException=Cannot update object that was never inserted.}, {
    NSAffectedObjectsErrorKey =     (
         "<Category: 0x1ed43cf0> (entity: Category; id: 0x1ed52970 <x-coredata://68E5D7B6-D461-4962-BC07-855349DB3263-7000-00000141BAB4C399/Category/tE8AB2F2E-C14C-4E93-8343-CC245B7726622> ; data: {\n    categoryId = nil;\n    isPrivate = 0;\n    name = techies;\n    users =     (\n    );\n})"
    );
     NSUnderlyingException = "Cannot update object that was never inserted.";
}

あなたの時間と配慮していただきありがとうございます。

AFIncrementalStore を使用しています。

4

6 に答える 6

4

このようなものはどうですか:

self.category.name = self.nameTextField.text;

NSManagedObjectContext *managedObjectContext = [[FTAppDelegate sharedAppDelegate] managedObjectContext];

if(![self.category isInserted])
{
    [managedObjectContext insertObject:self.category];
}

NSError *error = nil;
[managedObjectContext save:&error];
if (error) {
    NSLog(@"error saving: %@",error);
}

基本的に、オブジェクトが以前に挿入されているかどうかを確認し、そうでない場合は挿入してからコンテキストを保存します。

于 2013-04-04T10:24:43.747 に答える
1

この問題に遭遇したばかりで、私の場合、問題は次のとおりでした。

  • 1) コンテキスト A で新しい管理対象オブジェクトを作成する
  • 2) コンテキスト A を保存する
  • 3) コンテキスト B から objectID でこのオブジェクトを取得します
  • 4) 管理対象オブジェクトに変更を加え、コンテキスト B を保存します。

通常は問題にはなりませんが、この場合、コンテキスト A は子コンテキストであるため、永続ストアに保存されません (コンテキスト B ではない親コンテキストにのみ保存されます)。そのため、コンテキスト B からマネージド オブジェクトのフェッチが行われると、コンテキストにはこのオブジェクトがありません。変更が行われると、コンテキストはとにかくそれらを保存しようとします...そして、このエラーが発生したときです。場合によっては (@Trausti Thor が述べたように)、refreshObject:mergeChanges: メソッドが役立ちます (データを別のコンテキストに渡します)。

あなたの場合、次のことを確認します。

1) [[FTAppDelegate sharedAppDelegate] managedObjectContext] からのマネージド オブジェクト コンテキストは、常に同じコンテキストを返します。

2) カテゴリを保存するとき、それが本当に永続ストアに保存されたかどうかを確認します (self.category.objectID.isTemporaryID == NO)

注: 2 番目の点はより重要です。注意深く見ると、カテゴリ オブジェクトにはまだ一時的な objectID があり、永続化されていないことを意味します。

于 2015-08-24T14:04:18.400 に答える
1

同じエラーが発生しますが、まれなシナリオで、ほぼ 100 回の試行で 1 回発生します。以下で私の問題を見つけてください:

コア データ モデルに 2 つの NSManagedObjects があります。

リードを入力し、リードを送信した後にフォームを更新(新しいリードを作成)するフォームがあります。リードを送信し続けると、ある段階で [managedObjectContext save:&error]; 以下のエラーが発生し始めます:

Domain=NSCocoaErrorDomain Code=134030 "The operation could not be completed. (Cocoa error 134030.)" UserInfo=0x1f251740 {NSAffectedObjectsErrorKey=( " (entity: LeadInfoAttribute; id: 0x1f2eb920 ; data: {\n attributeId = 0;\n Lead = nil;\n optional = nil;\n orderId = 0;\n title = nil;\n value = Bjjbjp;\n})" ), NSUnderlyingException=一度も挿入されていないオブジェクトを更新できません。}

そして、アプリを終了して再起動しない限り、同じエラーが発生し続けます。このエラーが発生した後、コアデータモデルで何も更新できません。私の質問は次のとおりです。

1- コア データの障害状態を削除できますか? つまり、save 呼び出しを再度行う前に、問題を引き起こしているオブジェクトをキャプチャして削除します。

2- この問題の考えられる理由は何ですか? 非常にまれであり、これを毎回再現することはできません。

于 2013-10-07T20:29:41.123 に答える
1

オブジェクトが managedObjectContext を失っています。どちらかを使用

self.managedObjectContext

またはオブジェクトを再フェッチします

[[FTAppDelegate sharedAppDelegate] managedObjectContext]

再取得したオブジェクトを編集して保存します。

于 2013-04-24T09:08:32.380 に答える
1

オブジェクトを更新するとき、insertNewObjectForEntityForName を使用することはできません。最初にオブジェクトを保存してから、次のようなものを呼び出す必要があります。

 [self.managedObjectContext refreshObject:_category mergeChanges:YES]

次に、managedObjectContext の保存を再度使用します。

これがダイレクト SQL の「INSERT」と「UPDATE」の違いです。

于 2013-01-29T13:11:49.257 に答える
0

起こっていると思うのは、正しい NSManagedObjectContext を取得していないということです。

セッションだと思ってください。したがって、更新すると正しいセッションが得られないため、オブジェクトはそこに存在しません。

2 回目の保存を行う前に、その NSManagedObjectContext でオブジェクトを見つけてください。さらにサポートが必要な場合は、作成と更新の間に何が起こるかを説明してください。

間違った NSManagedObjectContext を取得するのは、AppDelegate のコードが正しくないか、メイン スレッド以外の別のスレッドからアクセスしていることが原因である可能性があります。

于 2013-01-30T10:04:51.323 に答える