2013-06-13 2 views
2

저는 앱 스토어에 두 번째 버전의 앱이 있습니다. 앱은 핵심 데이터를 사용하여 앱 업그레이드가 설치 될 때 손실되지 않도록하려는 정보를 저장합니다.App Store에서 앱을 업데이트하면 앱의 핵심 데이터 데이터베이스가 삭제됩니까?

제 질문은 사용자가 iPad에 버전 1.0이 설치되어 있고 핵심 데이터베이스에 데이터가 저장되어있는 경우 버전 1.1 업데이트를 다운로드하여 설치하면이 데이터베이스가 삭제된다는 것입니다.

+1

아니요, 다른 곳에서 삭제하거나 찾으려고하지 않고서는 아닙니다. 업데이트가 발생하면 앱 샌드 박스의 데이터 파일이 그대로 유지됩니다. –

답변

7

전적으로 귀하에 달려 있습니다. 핵심 데이터 스택을 설정할 때 NSPersistentStoreCoordinator가 원하는 응용 프로그램의 쓰기 가능한 폴더에있는 특정 파일을 가리킬 수 있습니다. 이 파일을 저장하는 위치는 앱 업데이트 중에 마이그레이션되는지 여부를 결정합니다.

일반적으로 사용자의 Documents 디렉토리에 데이터베이스 파일을 저장하면 응용 프로그램에 대한 업데이트를 설치할 때 iOS가 파일을 복사하게됩니다. 그런 다음 시작시 해당 데이터베이스를 적절하게 처리해야합니다 (데이터 업데이트, 스키마 마이그레이션 등). 예를 들어, 임시 디렉토리에 파일을 배치하면 업데이트 중에 손실 될 수 있습니다.

자세한 내용은 File System Programming GuideCore Data Model Versioning and Data Migration을 참조하십시오.

+0

감사합니다. NSURL * storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent : @ "Data.sqlite"]; 데이터베이스가 Documents 디렉토리에 있으므로 업데이트 중에 데이터베이스가 삭제되지 않는다고 말합니다. 나는이 글이 모델이 바뀌지 않은 경우에 한해서 읽는 것으로 이해한다. 모델이 변경되면 데이터베이스는 어디에서나 삭제됩니다. 그게 맞습니까? – RGriffiths

+1

아닙니다. 데이터베이스가 Documents 디렉토리에 있으므로 앱 업그레이드를 통해 삭제되지 않습니다. 업그레이드시 모델을 변경하면 데이터베이스는 여전히 삭제되지 않습니다. * 해당 데이터베이스의 데이터를 적절하게 마이그레이션하는 것은 귀하의 책임입니다 *. 자세한 내용은 [핵심 데이터 모델 버전 관리 및 데이터 마이그레이션] (https://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html)을 참조하십시오. – Tim

+0

@Tim은 iOS 스토리지 가이드 라인 때문에 "directory 속성"을 문서 디렉토리에 저장된 데이터베이스 파일에 추가해야했습니다. icloud에서 백업 한 후 시스템이 데이터베이스 파일을 삭제할 위험이 있거나 가능성이 있습니다. 내 데이터베이스 (데이터베이스 파일)를 풀 수 있습니까?그렇다면 이것을 피하려면 어떻게해야합니까? – ViruMax

0

사과 코드에서 대리자 영구 저장소 메서드의 주석을 제거하거나 직접 작성하지 않으면 삭제하면 안됩니다. 사용자 데이터베이스를 삭제하지 않고 마이그레이션 코드를 작성하지 않은 경우 앱이 다운됩니다 (모델을 변경 한 경우). 간단한 마이그레이션은 간단하고 구현하기 쉽습니다. 옵션에 대한 사전을 전달합니다 (아래 참조).
데이터 모델에서 무엇을 변경 했습니까?

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES],  NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES],  NSInferMappingModelAutomaticallyOption, nil]; 

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                configuration:nil 
                 URL:storeUrl 
                 options:options 
                 error:&error]) { 

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 
+0

최신 업데이트 (현재 App Store에서 사용 가능)에서 모델을 변경할 필요가 없으므로 사용자가 문제가되지 않는다고 말하는 것에서? 그러나 나는 기존 엔티티에 새로운 속성을 추가 한 다음 버전을 개발 중이다. 이것이 내가 관리해야하는 것입니다 - 맞습니까? – RGriffiths

+0

오른쪽 - 모델을 변경하지 않으면 데이터베이스가 업그레이드 후에도 계속 작동합니다. 속성을 추가하는 것은 소위 "가벼운"마이그레이션에서 합법적 인 변경이지만 해당 기능을 사용하려면 한 줄 또는 두 개의 코드를 변경해야합니다. Xcode가 매핑을 유추 할 수 없다는 변경을하면 (기본값없이 필요한 선택적 속성을 만드는 것처럼), 더 많은 사용자 지정 데이터 마이그레이션을 수행해야합니다. – Tim

+0

Richard, 응답의 첫 번째 부분에 답하십시오. 예, 모델에 변경 사항이 없으면 마이그레이션 할 필요가 없습니다. 이제 속성을 변경하면 이전 응답에서 제공 한 코드를 추가해야합니다. 또한 모델의 버전을 변경하고 기존 모델의 내용을 변경하지 말고 모델을 클릭하십시오. 파일 브라우저에서 xcdatamodd를 클릭 한 다음 툴바에서 "편집기"> "새 버전 모델 추가"를 선택하고 현재 모델을 기반으로하십시오 . 이제 xcdatamodeld & 속성에서 파일 속성을 클릭하고 모델을 새 버전으로 설정하십시오. – kevnm67

0

이것은 전적으로 CoreData와 관련이 없지만 공유해야한다고 생각합니다.

추가 리소스를 다운로드하고 Documents의 하위 폴더에 저장하고 .plist 파일 (/ Documents)에 경로를 저장하는 앱이 있습니다.

전체 경로를 저장하고 있었기 때문에 나중에 사용자가 응용 프로그램을 업데이트하면 경로가 더 이상 유효하지 않습니다. 앱 모래 상자 경로에 '임의의 문자/숫자'부분이 있습니다 (). 이고 앱을 업데이트하면 해당 부분이 변경됩니다.

+0

좋은 지적! 업그레이드 프로세스는 기본적으로 새로운 클린 복사본을 설치 한 다음 모든 관련 파일 (Documents 폴더에있는 파일 포함)을 새 설치로 복사합니다. 그런 다음 앱의 이전 사본을 제거합니다. 이렇게하면이 파일의 절대 경로가 변경되므로 응용 프로그램 루트와 관련된 경로로 (거의) 항상 작업해야합니다. – Tim

관련 문제