2011-12-03 2 views
7

UIManagedDocument를 사용하여 데이터를 관리하고 있습니다. 모델을 만들고 사용하면 모든 것이 작동하는 것처럼 보이지만 변경 사항이 SQLite 스토어에 다시 쓰여지지 않습니다.UIManagedDocument 저장 안함

UIManagedDocument에 대한 설명서에 따르면 자동 저장은 데이터를 데이터베이스에 보존해야하지만 실제로 발생하지는 않습니다.

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

이렇게하면 내가 추가하려는 객체를 가져오고 성공합니다.

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

이 항목을 다른 개체의 항목 컬렉션에 추가 한 다음 변경 작업이 완료되었음을 문서에 알려줍니다.

필자는 얼마되지 않아 코어 데이터 저장소에 기록 된 변경 사항을 확인하기 위해 약간의 시간이 걸릴 것으로 예상하지만 인스 트루먼 테이션에서 보았을 때, 결코 발생하지 않는다고 봅니다.

항목 모음은 NSOrderedSet이며, 때문에이 항목에 대한 코멘트 :

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

: 컬렉션을 보유하고있는 객체 : 내가 addItemsObject을 추가 한

Exception thrown in NSOrderedSet generated accessors

아마도 Core Data가 항목 컬렉션이 변경되었다는 정보를 받는데 문제가있을 수 있지만 어떻게 표시되지는 않습니다.

+0

인스트루먼트를 사용하면 데이터가 코어 데이터 캐시에 쓰여지고 있음을 알 수 있습니다. 하지만 핵심 데이터 저장 도구에는 나타나지 않으며 앱을 종료하고 다시 시작하면 변경 사항이 사라집니다. – stevex

+3

내 문제가 발견되었습니다. 내가 추가하려고하는 객체에 오류가 있음을 알았습니다. 필요한 속성을 놓쳤습니다. handleError를 재정의하지 않고 문제가 있다는 징후가 없습니다. 여기에 블로그 블로깅 : http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/ – stevex

답변

9

내 문제가 발견되었습니다. 내가 추가하려고하는 객체에 오류가 있음을 알았습니다. 필요한 속성을 놓쳤습니다. handleError를 재정의하지 않고 문제가 있다는 징후가 없습니다. 내가 처음 엔티티를 생성, 내가 서버에서 데이터를 가져 내 방법에서 http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

+1

이것은 대단한 발견입니다. 사실 CoreData는 많은 경우 객체가 메모리에 지속되도록 허용하지만 그렇지 않은 객체를 허용합니다. 디스크에 저장하면 시간이 지나치게 오도 될 수 있으며 주어진 수정 사항은 훌륭합니다. – NSTJ

+0

나는 미래 링크 실패의 경우에 당신의 링크를 요약하는 대답을 올려 놓았다 :) – olynoise

1

그 후 나는 즉시 문서에 변경 사항 저장하려면 다음 두 가지 방법 전화 :

여기에 대해이 블로그

을 @ stevex의 링크에서
[self.document updateChangeCount:UIDocumentChangeDone]; 
[self.document savePresentedItemChangesWithCompletionHandler:^(NSError *errorOrNil) { 
      ... 
     }]; 
0

키 걸릴가는 요리/요약 :

하면 UIManagedDocument의 -updateChangeCount 메서드를 호출하거나 문서의에 등록되어 변화를 트리거해야합니다. 그렇지 않으면 문서에 아무 것도 저장하지 않아도된다고 생각하지 않습니다.

또한 일부 주요 방법을 서브 클래 싱하면 자동 저장이 발생하고 오류가 있는지 확인할 수 있습니다.

- (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); 
}