상점을 여는 데 사용 된 모델이 상점을 만드는 데 사용 된 모델과 호환되지 않습니다


181

xcode 3.2에서 Core Data 모델을 만들고 Xcode 4.2에서 업그레이드 한 후 NSManagedObject 하위 클래스의 새 엔터티를 추가했습니다 (새 엔터티 참조).

첫째, 이전 그룹과 같은 그룹에 있지 않기 때문에 이상하게 보입니다. 다음은 xcode 4.2의 그림입니다 (AlkitabDB는 xcode 3.2에서 만든 것입니다. EndeDB는 현재 xcode 버전 (4.2)의 새로운 것입니다).

새로운 엔티티는 xdatamodel에 그룹화되지 않습니다

두 번째로, 그대로 두었다가 첫 번째 엔티티 (이전 엔티티)와 같은 방식으로 두 번째 엔티티 (새 엔티티)에 액세스하면 제목의 오류가 나타납니다.

오류는 다음과 같습니다.

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}

    7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
    8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
    9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

이전에 솔루션을 찾고 시뮬레이터에서 응용 프로그램을 제거하고 응용 프로그램을 다시 실행해야한다는 것을 알았습니다. 작동하지 않습니다. 누구 든지이 문제에 대한 해결책을 알고 있습니까? 도와주세요.

답변:


294

앱을 삭제하는 것은 때때로 그렇지 않습니다! 앱이 이미 게시되었습니다. 데이터베이스에 새 엔터티를 추가하고 계속 진행할 수는 없습니다. 마이그레이션을 수행해야합니다!

문서를 파고 싶지 않고 빠른 해결책을 찾는 사람들을 위해 :

  1. .xcdatamodeld 파일을여십시오
  2. 편집기를 클릭하십시오
  3. 모델 버전 추가 ...를 선택하십시오.
  4. 모델의 새 버전 추가 (추가 된 새 데이터 모델 그룹)
  5. 메인 파일을 선택하고 파일 관리자를 엽니 다 (오른쪽 패널)
  6. 그리고 아래의 것은 Versioned core data model현재의 데이터 모델 데이터 모델의 새 버전을 선택
  7. 전부는 아닙니다) 소위 "라이트 마이그레이션"을 수행해야합니다.
  8. 로 이동하여 생성되는 AppDelegate위치를 찾으십시오.persistentStoreCoordinator
  9. 이 줄을 찾으십시오 if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. nil옵션을 다음으로 대체하십시오 @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}(실제로 해당 방법의 주석 코드에서 제공됨)
  11. 자, 재미 있어요!

PS 이것은 가벼운 마이그레이션에만 적용됩니다. 마이그레이션을 간단한 마이그레이션으로 적용하려면 변경 사항을이 협 대역으로 제한해야합니다.

  • 속성 (속성 또는 관계)을 추가하거나 제거합니다.
  • 비 선택적 속성을 선택적으로 만드십시오.
  • 기본값을 제공하는 한 선택적 속성을 비 선택적으로 만드십시오.
  • 엔터티를 추가하거나 제거하십시오.
  • 속성 이름을 바꿉니다.
  • 엔터티 이름을 바꿉니다.

스위프트 4

coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

2
기본 파일은 생성 한 .xcdatamodel입니다. 유틸리티 창의 첫 번째 탭 (오른쪽 하나)을 열고 "모델 버전"(Xcode 5.1)을 찾아 현재 : "새로 생성 된 .xcdatamodel"
Stas

1
Computer_whiz123 @, 엑스 코드 5.1.1에 '는 모델 버전'이라고
스타스

1
Swift는 어떻게합니까?
애디슨

2
이 오류가 발생합니다. "CoreData : 오류 : -addPersistentStoreWithType : SQLite 구성 : (null) URL : file : ///...file.sqlite 옵션 : {NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1;} ... 오류가 반환되었습니다 Domain = NSCocoaErrorDomain Code = 134130 "작업을 완료 할 수 없습니다. (코코아 오류 134130.) "
CarmenA

3
스위프트 마이그레이션 옵션 :let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
HamzaGhazouani

285

시뮬레이터에서 앱을 제거하고 프로젝트를 정리하십시오. 그 문제를 해결해야합니다. 앱을 삭제할 때 디버거에서 실행되고 있지 않은지 확인하십시오. 그렇지 않으면 실제로 제대로 삭제되지 않습니다.

당신이 사라지고 있는지 확인하려면 Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/실행중인 버전에서 응용 프로그램 폴더 의이 디렉토리 를 확인하십시오 .

참고 : 이것은 개발 전용입니다. 프로덕션을 위해서는 일종의 마이그레이션을 구현해야합니다. 가벼운 마이그레이션이 가장 간단한 Google "핵심 데이터 마이그레이션"


필립에 대한 thx 대답, 나는 시도하고 작동하지 않았다 :(, 다른 제안이 있습니까?
dejoong

사용하는 코드를 게시하여 앱 대리자에 모델 및 영구 저장소를 만들 수 있습니까?
Philippe Sabourin

왜 이런 일이 일어나고 왜 그런 해결책이 속임수인지에 대해서는 조금 불합리합니다.하지만 도움이 될 수는 없습니다. 도움 친구를 위해! !!
Apple_iOS0304

내가 실수로 내 모든 프로젝트 파일을 휴지통 전송 곳에 나 엑스 코드 4.6에서 문제를 해결 도왔 : /
ramirogm

6
이것은 개발 전용입니다! 프로덕션에는 모델 버전 관리 및 마이그레이션을 사용합니다. developer.apple.com/library/ios/#documentation/cocoa/Conceptual/…
Philippe Sabourin

35

AppDelegate.m 파일에 다음과 같이 핵심 데이터 메서드에 대한 persistStoreCoordinator를 생성하는 동안 Options 속성을 추가하십시오.

목표 -C

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }

    NSLog(@"persistentStoreCoordinator___");
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];

    NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    NSLog(@"persistentStoreCoordinator___2");
    return _persistentStoreCoordinator;
}

빠른

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    var failureReason = "There was an error creating or loading the application's saved data."

    // MAIN LINE OF CODE TO ADD
    let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
                    NSInferMappingModelAutomaticallyOption: true]

    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}

내 문제를 해결했다 ..


1
이 게시물이 정말 유용합니다
Subramani

23

답변 : 시뮬레이터에서 앱을 제거하고 프로젝트를 정리하고 다시 빌드하십시오.

참고 : Core Data 정의를 변경할 때마다 실제 장치 또는 시뮬레이터에 설치된 앱을 삭제하고 프로젝트를 정리 한 후 다시 빌드하십시오.


시뮬레이터의 내용과 설정을 재설정하면 문제가 해결되었습니다. 감사합니다.
septerr

14

예. 물리적 장치에서 앱을 삭제하고 다시 빌드하면 작동합니다.


이것은 실제로 받아 들여진 대답보다 내 문제를 해결했습니다. 감사!
Ken W

생산에서 일어나는 일은 정답이 아닙니다
Eduardo Oliveros

이것은 끔찍한 대답입니다. 새 모델에 마이그레이션을 추가해야합니다. 그렇지 않으면 앱이 작동하지 않습니다
aryaxt

14

신속하게 AppDelegate.swift에서 라인을 찾으십시오.

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration:  nil, URL: url, options: nil )

그리고 그것을 대체하십시오

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

11

방금 며칠 동안이 오류뿐만 아니라 mergedModelFromBundles 충돌과 싸우고 "*라는 두 개의 다른 엔티티와 모델을 병합 할 수 없습니다"오류가 발생했습니다.

근본적인 문제는 Xcode가 장치에서 오래된 리소스를 제거하지 않으며 충돌을 일으키는 이전 버전의 데이터 모델 (.mom 파일)이 있다는 것입니다. 그렇기 때문에 앱을 삭제하면 내 기기 중 하나에서 문제가 해결되었습니다.

다른 SO 답변 을 통해이 블로그 게시물 을 찾은 후 모든 .mom 파일을 찾는이 줄을 변경하여 내 앱을 이전 모델에 더 견딜 수있게했습니다.

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

이것으로 필터 디렉토리에서만 보입니다.

NSString *path = [[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

이 질문 에서 recursivePathsForResourcesOfType 을 사용 했습니다. 응용 프로그램의 모든 .mom 파일을 기록하여이를 파악하는 데 도움이됩니다.

NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]];
NSLog(@"All .mom files:%@",momPaths);

또한 iExplorer 를 사용 하여 불필요한 .mom 파일을 보았습니다 (아직 삭제하지는 않았습니다).

아래 방법도 도움이되었습니다. [psc managedObjectModel]에서 반환 한 병합 모델에 엔터티가 있었으며이 모델은 더 이상 내 모델이나 상점 자체에는 존재하지 않습니다. 이것은 깨끗한 건물이 제거하지 않은 오래된 모델이 장치 자체에 캐시되어 있다고 믿었습니다. 이 방법은 모델에서 동일하거나 변경, 추가 또는 제거 된 각 엔티티를 기록합니다. ( 이 SO 답변 으로 시작점으로 작성 ) :

- (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL {
    NSError *error = nil;

    // Get the entities & keys from the persistent store coordinator
    NSManagedObjectModel *pscModel = [psc managedObjectModel];
    NSDictionary *pscEntities = [pscModel entitiesByName];
    NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]];
    //NSLog(@"psc model:%@", pscModel);
    //NSLog(@"psc keys:%@", pscKeys);
    NSLog(@"psc contains %d entities", [pscModel.entities count]);

    // Get the entity hashes from the storeURL
    NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                                          URL:storeURL
                                                                                        error:&error];
    NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"];
    //NSLog(@"store metadata:%@", sourceMetadata);
    NSLog(@"store URL:%@", storeURL);
    NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]);
    NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]);
    NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]];

    // Determine store entities that were added, removed, and in common (to/with psc)
    NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys];
    NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *changedEntities = [NSMutableSet new];
    [addedEntities minusSet:storeKeys];
    [removedEntities minusSet:pscKeys];
    [commonEntities minusSet:removedEntities];
    [commonEntities minusSet:addedEntities];

    // Determine entities that have changed (with different hashes)
    [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
        NSData *storeHash = [storeHashes objectForKey:key];
        NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
        if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) {
            if (storeHash != nil && pscDescrip.versionHash != nil) {
                [changedEntities addObject:key];
            }
        }
    }];

    // Remove changed entities from common list
    [commonEntities minusSet:changedEntities];

    if ([commonEntities count] > 0) {
        NSLog(@"Common entities:");
        [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([changedEntities count] > 0) {
        NSLog(@"Changed entities:");
        [changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\tpsc   %@:\t%@", key, pscDescrip.versionHash);
            NSLog(@"\tstore %@:\t%@", key, storeHash);
    }];
    }
    if ([addedEntities count] > 0) {
        NSLog(@"Added entities to psc model (not in store):");
        [addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([removedEntities count] > 0) {
        NSLog(@"Removed entities from psc model (exist in store):");
        [removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSLog(@"\t%@:\t%@", key, storeHash);
        }];
    }

    BOOL pscCompatibile = [pscModel isConfiguration:nil     compatibleWithStoreMetadata:storeMetadata];
    NSLog(@"Migration needed? %@", pscCompatibile?@"no":@"yes");

    return pscCompatibile;
}

사용법 : 각 상점을 NSPersistentStoreCoordinator에 추가하기 전에 호출됩니다.

    [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL];
    _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType
                                          configuration:nil
                                                    URL:self.iCloudStoreURL
                                                options:options
                                                  error:&localError];

10

Core Date 정의를 변경할 때마다 실제 장치 또는 시뮬레이터에 설치된 앱을 삭제해야합니다.


20
프로덕션 앱은 어떻습니까? 핵심 데이터를 변경하여 App Store에 업데이트를 푸시하면 즉시 중단됩니까? Thx
rwyland


3
예, CD 모델을 변경하면 이전 모델로 생성 된 데이터가로드되지 않습니다. 이를 처리하려면 문제점을 감지하고 핵심 데이터 마이그레이션을 수행해야합니다.
Johan

8
  1. 앱 실행을 중지하십시오.
  2. 시뮬레이터에서 앱을 삭제하십시오.
  3. Product -> Clean
  4. 빌드하고 실행하십시오.

4
생산에 나쁜 습관, 응용 프로그램 충돌
Eduardo Oliveros

7

Swift 2.1, Xcode 7에서 가장 효과적인 솔루션은 다음과 같습니다.

  1. 시뮬레이터에서 앱 삭제 (Cmd + Shift + H를 눌러 홈 화면으로 이동하십시오.

  2. Cmd + Shift + H를 다시 ​​사용하여 앱 춤 중지

  3. 프로젝트로 돌아가서 다시 실행

2 개의 엔티티가 설정된 Core Data에서 쓰거나 읽을 때이 문제가 발생했습니다. 앱을 삭제하고 프로그램을 다시 실행하면 문제가 해결되었습니다.


2
생산에 나쁜 습관, 응용 프로그램 충돌
Eduardo Oliveros

6

[Simulator App Folder]/Document/*.sqlite엔터티를 변경 한 후 파일을 삭제 하고 작동했습니다. 물론 .sqlite 파일에는 저장된 모든 데이터와 구조가 포함되어 있습니다.


2
나도 일했다. 이것이 충분해야 합리적으로 보입니다. 하지만 DB에 이미있는 모든 데이터를
잃어 버렸습니다

6

시뮬레이터에서 응용 프로그램을 삭제하고 코드를 정리하고 .its 작동합니다. 도움이 될 수 있습니다.


6

Swift를 사용하는 경우

@Stas의 답변을 따르고 App Delegate에서 nil 대신 옵션을 삽입하십시오.

let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {

1
왜 그것이 투표에 실패했는지는 모르겠지만, 나는 그것을 좋아했습니다. Swift 구문을 제공해 주셔서 감사합니다.
Matt Long

좋은! 작동합니다! 감사합니다! 이 문제를 3 시간 동안 해결하려고합니다.
mr_ivan777 오전

이 코드를 어디에 넣을까요? 이 코드를 사용하여 코어 데이터를로드하십시오.
MAS 존.

5

시뮬레이터에서 "콘텐츠 및 설정 재설정"을 시도하십시오. 앱과 Clean 빌드를 삭제 한 후 나를 위해 일했습니다.


3
그러나 이렇게하면 실제 컴퓨터 사용자에게도 같은 문제가 발생하지 않습니까?
Maury Markowitz

4

내 앱과 동일한 문제가 발생했습니다 (아직 App Store에서 출시되지 않음).

내가 고친 방법은 다음과 같습니다.

  1. 클린 실행 (Cmd + Shift + K)
  2. iOS 시뮬레이터 재시작
  3. iOS 시뮬레이터-> 컨텐츠 및 설정 재설정 (탐색기에서)

(3) 마침내 마침내 제대로 작동하는 단계였습니다. 도움이 되었기를 바랍니다!




2

코어 데이터 모델을 변경하는 경우 코어 데이터에 기존 지속 객체 (사용자가 현재 릴리스 된 버전으로 만든)를 새 모델에 적용하는 방법을 알려주는 마이그레이션 정책을 제공해야합니다.

일부 시나리오의 경우 Core Data는 이전 모델에서 새 모델로의 매핑을 자동으로 유추 할 수 있습니다. 보다 복잡한 변경을 위해 마이그레이션을 수행하는 일부 논리를 구현해야 할 수도 있습니다.

자세한 내용은 핵심 데이터 모델 버전 관리 및 데이터 마이그레이션 프로그래밍 안내서 에서 찾을 수 있습니다 .

업데이트
스택 오버플로에 대한이 답변 은 Core Data의 경량 마이그레이션의 기본 사항을 다루고 시작하는 데 필요한 코드도 있습니다.


다음은 데이터 마이그레이션에 대한 동일한 답변입니다. stackoverflow.com/questions/8881453/…
Dhaval H. Nena

1

이 문제는 일반적으로 DB 가 작성된 버전 간의 비 호환성 으로 인해 발생합니다 . 이 문제에 대한 일반적인 접근 방식 은 앱삭제하고 다시 설치 하는 것입니다. 그러나 언급 한 경우 DB 버전은 Xcode 3.2와 4.2에서 완전히 다릅니다. 따라서 동일한 버전의 Xcode for DB를 사용하는 것이 좋습니다.


1

첫째, xcdatamodeld번들에 있어야 할 것은 xcdatamodel파일입니다. 귀하의 서브 클래스는해야 하지 에있을xcdatamodeld . 그것들을 거기 밖으로 옮기십시오. 그들이 컴파일러를 혼란스럽게 할 가능성이 있습니다.

둘째, 오류는 핵심 데이터가 모델을 찾을 수 없음을 나타냅니다. 데이터를 생성 한 다음 모델을 터치 했습니까? 당신은 (필립 제안) 데이터를 삭제하거나 모델의 변경 압연에 의해 그 중 하나를 수정에 일관성이없는 상태 및 필요로하는, 그래서 경우 BACK을 .


xcdatamodel 번들에서 모델을 가져 오는 방법을 알고 있습니까? 또는 shd 방금 삭제 했습니까?
dejoong

xcdatamodel파일 인 모델이 있어야 합니다. 이동해야하는 .h 및 .m 파일입니다. Finder를 사용하십시오.
Marcus S. Zarra

0

오류가 발생했지만 오류가 발생한 이유는 다음과 같습니다.

원래 "엔트리"라는 엔터티가 하나 있고 데이터베이스에서 해당 엔터티에 대해 하나의 행이 저장되었습니다. 그런 다음 "Person"이라는 다른 엔터티를 추가하고 추가 한 후 빌드하고 오류가 발생했습니다. 그래서 "Person"엔티티를 삭제 한 다음 앱을 빌드하고 "Entry"에있는 행을 삭제 한 다음 응용 프로그램을 닫아 문제를 해결했습니다. 그런 다음 휴대 전화에서 앱을 완전히 삭제 한 다음 다시 작성하면 정상적으로 작동합니다. 어느 단계에서 문제를 해결했는지 확실하지 않지만 (행 또는 앱 삭제) 솔루션을 찾고 있다면 도움이 될 것입니다. :)

편집 : 아 그리고 당신이 응용 프로그램을 다시 빌드하기 위해 새로운 엔티티 (내 경우에는 "개인")를 삭제하는 것에 대해 걱정한다면 CMD + Z를 사용하여 나중에 다시 가져올 수 있음을 기억하십시오!


0

나는이 문제가 있었다-먼저 시뮬레이터를 재설정 한 다음 프로젝트를 정리하고 다시 빌드하십시오. 그런 다음 작동합니다.


0

핵심 데이터를 변경할 때 (필드를 테이블에 추가하거나, 필드를 제거하는 등) 애플리케이션 문서 폴더의 sqlite 파일은 스키마와 동기화되어야합니다.

이 파일은 기본적으로 덮어 쓰지 않으므로이 파일을 다시 생성해야합니다.

다음과 같이하세요:

  1. NSURL이 가리키는 폴더로 이동하십시오. (이 경로는 충돌 전에 응용 프로그램에서 생성 한 예외 메시지에서 찾을 수 있습니다.) 예 : / Users // Library / Application Support / iPhone Simulator // Applications // Documents

  2. sqlite 파일 제거 또는 이름 바꾸기

  3. 응용 프로그램 정리 및 다시 실행
  4. 응용 프로그램을 실행하면 새로운 sqlite 파일이 생성됩니다.

스키마와 Xcode가 동기화되어 있는지 확인합니다.


-1

Mac 앱 개발의 경우 :

  1. 프로젝트 청소
  2. 깨끗한 파생 데이터
  3. / Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents /로 이동하여 내부의 모든 파일 (예 : ".sqlite", ".sqlite-shm"...)을 삭제하십시오.

그것은 나를 위해 일했습니다, 이것이 도움이되기를 바랍니다.


-2

iOS 시뮬레이터-> 내용 및 설정 재설정 ...

나를 위해 일했다

iOS 시뮬레이터-> 내용 및 설정 재설정 ...-> iOS9 (xcode 7.1)에서도 재설정 가능


4
생산에 나쁜 습관, 응용 프로그램 충돌
Eduardo Oliveros
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.