2013-04-22 4 views
1

UIManagedDocument 및 그 기능에 대해 배우기 시작했습니다. 내가 아는 바로는 데이터베이스의 한 형태가 문서 디렉토리의 한 위치에 저장되어 있습니다.NSPersistentStoreCoordinator가 UIManagedDocument에 생성되지 않았습니다

어쨌든, 나는 UIManagedDocument를 만들고 컨텍스트에 데이터를 저장하는 몇 초 후에, 그러나 그 NSManagedObjectContext 내에서 데이터를 저장하여 데이터베이스로 사용하려고 해요 (I가 시간 초과 같은데요 후) 앱이 다운되고 지속적인 스토어 코디네이터가 없다고 알려줍니다.

관리되는 문서를 만든 후 영구 저장소 조정자를 만드는 방법에 대한 Apple 문서에 대한 많은 지침은없는 것처럼 보입니다.

정확히 어떻게합니까?

감사합니다.

편집

코드 내가 사용 :

NSURL *url = [[self iCloudDocumentsURL] URLByAppendingPathComponent:nameOfDocument]; 

NSMutableArray *books = [self.books mutableCopy]; 
[books addObject:url]; 

[self setBooks:books]; 

UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url]; 

NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption : @YES, 
          NSInferMappingModelAutomaticallyOption : @YES, 
          NSPersistentStoreUbiquitousContentNameKey : document.fileURL.lastPathComponent, 
          NSPersistentStoreUbiquitousContentURLKey : [self iCloudCoreDataLogFilesURL] }; 
[document setPersistentStoreOptions:options]; 

if (document.documentState == UIDocumentStateClosed) { 
    [document openWithCompletionHandler:^(BOOL success) { 
     Book *book = [Book newBookWithTitle:bookTitle 
        inManagedObjectContext:document.managedObjectContext]; 

     [document updateChangeCount:UIDocumentChangeDone]; 
    }]; 
} 

업데이트 백그라운드 스레드에서이 코드를 수행 한 후. 내 응용 프로그램은 문서를 연 후 완료 핸들러의 성공 여부를 'NO'로 기록합니다.

2013-04-23 00:01:08.381 Notable[193:4b0b] -[_PFUbiquityRecordsImporter rollResponseOperation:encounteredAnError:whileTryingToAdoptBaseline:](1545): CoreData: Ubiquity: <PFUbiquityBaselineRollResponseOperation: 0x1fa561d0> localPeerID: mobile.2DDB96C5-A317-5BE5-8F29-9F5E6681A27A, storeName: A-B893A0AB-B764-42F1-9402-38790DCEF96B, modelVersionHash: NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas= 
    ubiquityRootLocation: <PFUbiquityLocation: 0x1e59b790>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs 

Encountered an error while trying to respond to the roll of baseline: <PFUbiquityBaseline: 0x1e54deb0>(0) 
    permanentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip 
    safeLocation: <PFUbiquityLocation: 0x1f8eb1b0>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/mobile.2DDB96C5-A317-5BE5-8F29-9F5E6681A27A 
    currentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip 

    storeName: A-B893A0AB-B764-42F1-9402-38790DCEF96B 
    modelVersionHash: NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas= 
    baselineArchiveLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip 

Error: Error Domain=NSCocoaErrorDomain Code=134310 "The operation couldn’t be completed. (Cocoa error 134310.)" UserInfo=0x1f8d2ae0 {baseline=<PFUbiquityBaseline: 0x1e54deb0>(0) 
    permanentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip 
    safeLocation: <PFUbiquityLocation: 0x1f8eb1b0>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/mobile.2DDB96C5-A317-5BE5-8F29-9F5E6681A27A 
    currentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip 

    storeName: A-B893A0AB-B764-42F1-9402-38790DCEF96B 
    modelVersionHash: NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas= 
    baselineArchiveLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip 
, localStoreKV=<PFUbiquityKnowledgeVector: 0x1f8220c0>()} 
userInfo: { 
    baseline = "<PFUbiquityBaseline: 0x1e54deb0>(0)\n\tpermanentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip\n\tsafeLocation: <PFUbiquityLocation: 0x1f8eb1b0>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/mobile.2DDB96C5-A317-5BE5-8F29-9F5E6681A27A\n\tcurrentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip\n\n\tstoreName: A-B893A0AB-B764-42F1-9402-38790DCEF96B\n\tmodelVersionHash: NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=\n\tbaselineArchiveLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip\n"; 
    localStoreKV = "<PFUbiquityKnowledgeVector: 0x1f8220c0>()"; 
} 

이 방법은 또한 내가에서 언급 한 CS193P 비디오에서 언급이 파일에 따라 필요가 믿는 'DocumentMetaData.plist을'(작성 : 그러나, 내 응용 프로그램이 충돌하지 않는 대신에 나는 다음과 같은 로그를 얻을 수 'persistentStore'라는 파일 대신 주석 (comment)을 사용합니다.

+1

코어 데이터에 대한 일반적인 설명으로, 데이터베이스로 생각하면 장기적으로는 어려움을 겪을 것입니다. 핵심 데이터는 데이터베이스가 아닌 지속성 프레임 워크입니다. 어느 정도까지는 데이터베이스처럼 작동하지만 Core Data == 데이터베이스 사고 방식에서 접근하면 뒤에서 당신을 물들이는 미묘한 차이가 있습니다. – theMikeSwan

+0

그래, Core Data가 데이터베이스가 아니라는 것을 알았습니다. (위에서 말했듯이) UIManagedDocument를 데이터베이스로 생각하기가 더 쉬웠습니다 (어쨌든 만들 어 응용 프로그램 용). –

+0

걱정하지 말고 그냥 길을 가려하지 말고 다른 사람들이 내려 가서 길 아래로 싫어하는 것을 보았습니다. – theMikeSwan

답변

0

UIDocument Class ReferenceCore Data Programming Guide에는 샘플 코드가 있습니다. 마스터 - 세부 템플릿을 사용하여 코어 데이터 기반 프로젝트를 생성하여 코어 데이터 스택 설정의 예를 볼 수도 있습니다. 이 코어 데이터와 첫 경험 인 경우

는, 나도 팀 Isted와 톰 해링턴, 또는 코어 데이터 (제 2 판)에 의해 아이폰 OS에 대한 핵심 데이터, 당신은 주제에 책 중 하나를 통해 작동 제안 : iOS, OS X 및 iCloud 용 데이터 저장 및 관리, Marcus Zarra.

나는 이상한 보이는 몇 가지를 참조하십시오

  • 로컬 파일 시스템에 [self iCloudDocumentsURL] 점을합니까?

  • URL이 도서 배열에 삽입되는 이유는 무엇입니까?

  • 열기가 성공했다고 가정하기 전에 블록의 변수를 테스트하십시오.

iOS 6.x에서도 iCloud Core Data는 주요 시간으로 준비되지 않았습니다. 그것은 분명히 새로운 iOS 개발자가 해결하고자하는 것이 아닙니다. Black Pixel의 매우 밝은 사람들이 자신의 제품 중 하나와 관련하여 무엇에 대해 말했는지 확인하십시오 : http://blackpixel.com/blog/2013/03/the-return-of-netnewswire.html.

+0

안녕하십니까, 답장을 보내 주셔서 감사합니다. 지금까지 스탠포드의 CS193P 비디오 'iCloud'에서 발견 한 것과 비슷한 응용 프로그램을 만들었습니다. 플리커 (Flickr) 데이터를 사용하는 대신, 문서를 만든 후 컨텍스트에 내 자신을 추가하고 싶습니다. –

+0

필자는 또한 [document updateChangeCount : UIDocumentChangeDone] 대신 문서 managedObjectContext의'save :'메서드를 사용했다. –

+0

'[self iCloudDocumentsURL]'은 본질적으로'[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier : nil] URLByAppendingPathComponent : @ "Documents "]'. 처음에는 혼란 스러웠지만, icloud를 사용할 수있을 때만 작동합니다. 문서는 로컬에 저장되고 클라우드에 푸시됩니다 (developer.icloud.com에서 확인). 문서 컬렉션은 내 컬렉션보기에서 사용됩니다. 이 배열을 설정하면 collectionview가 다시로드됩니다. –

1

UIManagedDocument를 사용할 때 직접 생성하지 않아도됩니다. 그러나 실용적이지 않습니다. 내부적으로 UIManagedDocument는 영구 저장소와 영구 저장소 코디네이터를 설정합니다. 그러나 기본 iCloud 코드가 작동을 완료하고, 서버와 통신하고, 새로운 데이터를 다운로드하는 등의 작업이 완료 될 때까지는 발생하지 않습니다.이 프로세스가 끝날 때까지는 아무 것도 할 수 없으므로 변경 사항을 저장할 수 없습니다. 변경 사항을 저장하십시오.

또한 때로는 iCloud가 귀하의 통제하에있는 이유없이 그 행위를 함께하지 못합니다.

개방 완성 처리기에서 success 값을 확인해야합니다. NO 인 경우 문제가됩니다. iCloud가 조각 났을 때 가끔을 제외한 복구 경로가 없습니다. 운이 좋다면 작동 할 때까지 몇 번만 다시 시도 할 수 있습니다. 파일 버그, 제발, 우리는 애플이 이것을 해결해야합니다.

+0

감사합니다. 지금 사용해 보겠습니다. 내가 이해할 수없는 것은 개발자가 iCloud를 잘 이해하고/성공적으로 사용하는 것이 얼마나 힘든 일인지에 있습니다. 특히 애플이 어떻게 자신의 응용 프로그램에서 '완벽하게'사용할 수 있는지. iCloud를 설치하고 거의 2 년 동안 작동하도록하는 방법에 관해서는 설명서와 도움이 많이 필요하다고 생각할 것입니다. –

+0

언급 한대로 (그리고 왜 내가하지 않았는지 모르겠다. 매개 변수를 생각해보십시오.) "성공"은 NO로 기록됩니다 –

+0

Apple은 Core Data *가있는 iCloud *를 간신히 사용합니다. iCloud에 있지만 핵심 데이터가없는 문서는 더 신뢰할 만하지만 결코 애플의 앱에서도 완벽하지는 않습니다. –

0

이 Adam을 고쳤는지 확실하지 않지만 persistentStore가 클라우드에 없어야합니다. 항상 로컬 저장소에 uiManagedDocument를 만들고 addPersistentStore에 대한 iCloud 옵션을 설정하십시오. CoreData는 앱이 실제 버전을 만들고 iCloud에서 데이터를 가져 오는 동안 앱을 사용할 수있는 즉각적인 저장소를 제공합니다. 완료되면 ICloud로 연결된 로컬 저장소로 전환됩니다. 거래 내역 만 iCloud에 게시되지만 그 내용은 귀하에게 적용됩니다.

관련 문제