7

UIManagedDocumentを使用してデータを管理しています。モデルを作成して使用すると、すべてが機能しているように見えますが、変更がSQLiteストアに書き戻されていません。

UIManagedDocumentのドキュメントには、自動保存でデータベースへのデータの永続化を処理する必要があると記載されていますが、それは行われていないようです。

    NSManagedObjectContext *moc = [doc managedObjectContext];
    NSError *error = nil;
    MyItem *itemToAdd = (MyItems *)[moc existingObjectWithID:(NSManagedObjectID *)itemsID error:&error];

これにより、追加したい(そして成功した)オブジェクトがフェッチされます。

   [itemContainer addItemsObject:itemToAdd];
   [doc updateChangeCount:UIDocumentChangeDone];

これにより、アイテムが別のオブジェクトのアイテムコレクションに追加され、変更が完了したことがドキュメントに通知されます。

この直後にCoreDataストアに書き込まれた変更が表示されると思いますが、Instrumentsで見ると、変更が行われないことがわかります。

アイテムコレクションはNSOrderedSetであり、このアイテムに関するコメントのため、次のようになります。

NSOrderedSetで生成されたアクセサーで例外がスローされました

コレクションを保持するオブジェクトにaddItemsObject:を追加しました:

- (void)addItemsObject:(MyItem *)value 
{
    NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.items];
    [tempSet addObject:value];
    self.items = tempSet;
}

アイテムコレクションが変更されたことがCoreDataに通知されて問題が発生している可能性がありますが、その方法がわかりません。

4

3 に答える 3

10

私は自分の問題を見つけました。追加しようとしたオブジェクトでエラーが発生したことが判明しました-必要なプロパティを見逃しました-そしてhandleErrorをオーバーライドせずに、問題があることを示すものはありません。

ここでそれについてブログに書いています:http: //blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

于 2012-08-21T00:03:38.143 に答える
1

サーバーからデータをフェッチするメソッドでは、最初にエンティティを作成し、その後、次の2つのメソッドを呼び出して、変更をドキュメントにすぐに保存します。

[self.document updateChangeCount:UIDocumentChangeDone];
[self.document savePresentedItemChangesWithCompletionHandler:^(NSError *errorOrNil) {
            ...
        }];
于 2013-11-26T10:19:33.583 に答える
1

@stevexのリンクからの重要なポイント/要約:

必ずUIManagedDocumentの-updateChangeCountメソッドを呼び出すか、ドキュメントのに登録されている変更をトリガーしてくださいundoManager。それ以外の場合、ドキュメントは何も保存する必要がないと考えます。

また、いくつかの主要なメソッドをサブクラス化すると、自動保存がいつ発生するか、エラーがあるかどうかを確認できます。

- (id)contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError {

    id retVal = [super contentsForType:typeName error:outError];
    NSLog(@"Autosaving document. contentsForType at fileURL %@ error %@", self.fileURL, *outError);
    return retVal;
}


- (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted {
    [super handleError:error userInteractionPermitted:userInteractionPermitted];
    NSLog(@"ManagedDocument handleError: %@  %@", error.localizedDescription, error.userInfo);
}
于 2017-10-23T21:33:06.760 に答える