Mô hình được sử dụng để mở cửa hàng không tương thích với mô hình được sử dụng để tạo cửa hàng


181

Tôi đã tạo một mô hình Dữ liệu lõi trong xcode 3.2 và sau khi nâng cấp trong Xcode 4.2, sau đó tôi đã thêm một thực thể mới của lớp con NSManagedObject (tham khảo thực thể mới).

Điều đầu tiên, nó trông kỳ lạ bởi vì nó không cùng nhóm với nhóm cũ. Đây là hình ảnh trên xcode 4.2 của tôi (AlkitabDB là ảnh tôi đã tạo trong xcode 3.2, EndeDB là ảnh mới từ phiên bản xcode hiện tại (4.2):

thực thể mới không được nhóm trong xdatamodel

Điều thứ hai, tôi để nó như vậy, sau đó tôi truy cập thực thể thứ hai (thực thể mới) giống như thực thể thứ nhất (thực thể cũ) và lỗi như tiêu đề xuất hiện.

Đây là lỗi:

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";
}

Tôi đã tìm kiếm giải pháp trước đó và phát hiện ra rằng tôi nên xóa ứng dụng khỏi trình giả lập và chạy lại ứng dụng, và nó không hoạt động. Có ai biết một giải pháp cho vấn đề này? Xin vui lòng giúp đỡ.

Câu trả lời:


294

Xóa ứng dụng đôi khi không phải là trường hợp!Đề nghị, ứng dụng của bạn đã được xuất bản! Bạn không thể chỉ cần thêm thực thể mới vào cơ sở dữ liệu và tiếp tục - bạn cần thực hiện di chuyển!

Đối với những người không muốn tìm hiểu tài liệu và đang tìm cách khắc phục nhanh:

  1. Mở tệp .xcdatamodeld của bạn
  2. nhấp vào Trình chỉnh sửa
  3. chọn Thêm phiên bản mô hình ...
  4. Thêm phiên bản mới của mô hình của bạn (nhóm dữ liệu mới được thêm vào)
  5. chọn tệp chính, mở trình kiểm tra tệp (bảng bên phải)
  6. và bên dưới Versioned core data modelchọn phiên bản mới của mô hình dữ liệu cho mô hình dữ liệu hiện tại
  7. ĐÓ KHÔNG PHẢI LÀ TẤT CẢ) Bạn nên thực hiện cái gọi là "di chuyển ánh sáng".
  8. Đi đến của bạn AppDelegatevà tìm nơi persistentStoreCoordinatorđang được tạo ra
  9. Tìm dòng này if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. Thay thế niltùy chọn bằng@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} (thực sự được cung cấp trong mã nhận xét trong phương thức đó)
  11. Ở đây bạn đi, vui chơi!

PS Điều này chỉ áp dụng cho di chuyển nhẹ. Để di chuyển của bạn đủ điều kiện là di chuyển nhẹ, các thay đổi của bạn phải được giới hạn trong dải hẹp này:

  • Thêm hoặc xóa một thuộc tính (thuộc tính hoặc mối quan hệ).
  • Làm cho một tài sản không tham gia tùy chọn.
  • Tạo một thuộc tính tùy chọn không phổ biến, miễn là bạn cung cấp một giá trị mặc định.
  • Thêm hoặc xóa một thực thể.
  • Đổi tên một tài sản.
  • Đổi tên một thực thể.

Dành cho Swift 4

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

2
tập tin chính là .xcdatamodel mà bạn đã tạo. Bạn nên mở tab đầu tiên của ngăn Tiện ích (bên phải một) và tìm "Phiên bản mẫu" (Xcode 5.1) và chọn Hiện tại: ".xcdatamodel mới được tạo của bạn"
Stas

1
@ Computer_whiz123, trong XCode 5.1.1, nó được gọi là 'Phiên bản mẫu'
Stas

1
Làm thế nào tôi có thể làm điều này là Swift?
Addison

2
Tôi gặp lỗi này: "CoreData: error: -addPersistentStoreWithType: Cấu hình SQLite: (null) URL: file: ///...file.sqlite tùy chọn: {NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStor Tên miền = NSCocoaErrorDomain Code = 134130 "Không thể hoàn tất thao tác. (Lỗi ca cao 134130.) "
CarmenA

3
Tùy chọn di chuyển Swift:let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
Hamza

285

Xóa ứng dụng khỏi trình giả lập và thực hiện sạch dự án của bạn. Điều đó sẽ xóa những vấn đề lên. Đảm bảo rằng bạn không chạy trong trình gỡ lỗi khi bạn xóa ứng dụng nếu không nó sẽ thực sự xóa nó đúng cách.

Nếu bạn muốn chắc chắn rằng nó đã biến mất, hãy kiểm tra thư mục này Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/để biết thư mục ứng dụng của bạn, bên dưới phiên bản bạn đang chạy.

Lưu ý: Điều này chỉ dành cho phát triển. Để sản xuất, bạn cần thực hiện một số loại di chuyển. Google "Di chuyển dữ liệu cốt lõi", với việc di chuyển nhẹ là đơn giản nhất.


Thx đã trả lời Philippe, tôi đã thử và nó không hoạt động :(, bạn có đề nghị nào khác không?
dejoong

Bạn có thể đăng mã bạn sử dụng mô hình tạo và lưu trữ liên tục trong đại biểu ứng dụng của bạn không?
Philippe Sabourin

Có một chút không hợp lý tại sao điều này xảy ra và tại sao một giải pháp như vậy lại là mánh khóe, nhưng đó là .. không thể giúp đỡ .. nywaz, đây là phiếu bầu của tôi .. cách tốt nhất tôi có thể làm ngay bây giờ để đánh giá cao hướng dẫn của bạn .. cảm ơn rất nhiều cho người bạn đời giúp đỡ. !!
Apple_iOS0304

Đã giúp tôi giải quyết một vấn đề trong Xcode 4.6, nơi tôi đã gửi vào thùng rác tất cả các tệp dự án của mình do nhầm lẫn: /
ramirogm

6
Cái này chỉ dành cho phát triển! Để sản xuất, bạn sử dụng phiên bản mô hình và di chuyển. developer.apple.com/l
Library / ios / # document / cocoa / Conceptionual / Giả

35

Chỉ cần thêm Tùy chọn thuộc tính trong khi tạo tệp PersentStoreCoordinator trong tệp AppDelegate.m cho phương thức dữ liệu cốt lõi như dưới đây

MỤC TIÊU-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;
}

NHANH

    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
}

Nó đã giải quyết vấn đề của tôi ..


1
Cảm ơn bạn vì bài đăng này nó thực sự hữu ích
Subramani

23

Trả lời: Xóa ứng dụng khỏi Trình mô phỏng, Thực hiện Dọn dẹp và Xây dựng lại Dự án của bạn.

Lưu ý: Bất cứ khi nào bạn thực hiện các thay đổi đối với định nghĩa Dữ liệu cốt lõi, hãy xóa ứng dụng được cài đặt trên Thiết bị vật lý hoặc Trình mô phỏng, Làm sạch dự án và xây dựng lại.


Đặt lại nội dung và cài đặt trong trình giả lập đã khắc phục sự cố cho tôi! Cảm ơn.
septerr

14

Đúng. Khi bạn xóa ứng dụng trên thiết bị vật lý và xây dựng lại nó sẽ hoạt động.


Điều này thực sự giải quyết vấn đề của tôi hơn là câu trả lời được chấp nhận. cảm ơn!
Ken W

Điều gì xảy ra trong sản xuất không phải là câu trả lời
Eduardo Oliveros

Đây là một câu trả lời khủng khiếp, bạn cần thêm di chuyển vào mô hình mới của mình nếu không ứng dụng sẽ bị sập trong prod
aryaxt

14

Đối với swift, trong AppDelegate.swift tìm dòng

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

và thay thế nó bằng

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

11

Tôi vừa mất vài ngày để chống lại lỗi này, cũng như sự cố sáp nhậpModelFromBundles và nhận được lỗi "Không thể hợp nhất các mô hình với hai thực thể khác nhau có tên *".

Hóa ra vấn đề gốc là Xcode không xóa tài nguyên cũ khỏi thiết bị và tôi đã có các phiên bản cũ của mô hình dữ liệu của mình (tệp .mom) gây ra xung đột. Đây là lý do tại sao xóa ứng dụng đã khắc phục sự cố trên một trong các thiết bị của tôi.

Sau khi tìm thấy bài đăng trên blog này thông qua một câu trả lời SO khác, tôi đã làm cho ứng dụng của mình trở nên khoan dung hơn với các mô hình cũ bằng cách thay đổi dòng này tìm kiếm TẤT CẢ các tệp .mom:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

về điều này, chỉ nhìn trong thư mục Bộ lọc:

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

Tôi đã sử dụng recursivePathsForResourceOfType từ câu hỏi này : để giúp tìm ra điều này bằng cách đăng nhập tất cả các tệp .mom trong ứng dụng:

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

Tôi cũng đã sử dụng iExplorer để xem các tệp .mom không liên quan (tôi chưa thử xóa chúng).

Phương pháp dưới đây cũng hữu ích. Nó cho thấy rằng một thực thể nằm trong mô hình được hợp nhất được trả về bởi [psc ManagedObjectModel] không còn tồn tại trong bất kỳ mô hình nào của tôi hoặc trong chính cửa hàng. Đây là những gì khiến tôi tin rằng một mô hình cũ đã được lưu vào bộ nhớ cache trên chính thiết bị mà tòa nhà sạch sẽ không xóa. Phương thức ghi lại từng thực thể giống nhau, được thay đổi hoặc thêm vào hoặc xóa khỏi mô hình. (được viết với câu trả lời SO này làm điểm bắt đầu):

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

cách sử dụng: được gọi trước khi thêm từng cửa hàng vào NSPersistentStoreCoordinator:

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

10

Mỗi khi bạn thay đổi định nghĩa Ngày lõi, bạn nên xóa các ứng dụng được cài đặt trên thiết bị vật lý hoặc trình giả lập.


20
Còn ứng dụng sản xuất thì sao? Họ sẽ gặp sự cố ngay lập tức nếu bạn đẩy một bản cập nhật lên App Store với các thay đổi đối với Dữ liệu cốt lõi? Thx
rwyland


3
Có, những thay đổi trong mô hình CD ngăn không cho dữ liệu được tạo với mô hình trước đó tải. Để xử lý vấn đề này, bạn cần phát hiện sự cố và thực hiện Di chuyển dữ liệu lõi.
Johan

8
  1. Dừng ứng dụng chạy.
  2. Xóa ứng dụng trên trình giả lập.
  3. Product -> Clean
  4. Xây dựng, chạy.

4
thực hành tồi trong sản xuất, làm hỏng ứng dụng
Eduardo Oliveros

7

Giải pháp đơn giản nhất phù hợp với tôi trong Swift 2.1, Xcode 7 là:

  1. Xóa ứng dụng khỏi Trình mô phỏng (Cmd + Shift + H để đi tới Màn hình chính. Nhấn và giữ ứng dụng, bấm chéo, giống như cách bạn thường xóa ứng dụng khỏi điện thoại)

  2. Cmd + Shift + H một lần nữa để dừng nhảy ứng dụng

  3. Quay trở lại dự án của bạn và chạy lại

Tôi gặp vấn đề này trong khi viết / đọc từ Core Data với 2 thực thể được thiết lập. Xóa ứng dụng và chạy lại chương trình đã khắc phục sự cố


2
thực hành không tốt trong sản xuất, làm hỏng ứng dụng
Eduardo Oliveros

6

Tôi chỉ xóa [Simulator App Folder]/Document/*.sqlitetập tin sau khi thực hiện thay đổi trong các thực thể và nó đã làm việc. Và tất nhiên, tệp .sqlite chứa tất cả dữ liệu và cấu trúc được lưu trữ sẽ bị mất.


2
Làm việc cho tôi quá. Có vẻ hợp lý rằng điều này là đủ. Bạn mất tất cả dữ liệu đã có trong DB mặc dù ...
bor

6

Vui lòng Xóa một ứng dụng khỏi trình giả lập và xóa mã và chạy .its hoạt động tốt. Nó có thể giúp bạn.


6

Nếu bạn đang sử dụng Swift.

Thực hiện theo câu trả lời của @Stas và chèn tùy chọn, thay cho số không, trong Đại biểu ứng dụng của bạn:

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

1
Không chắc tại sao điều đó đã được bỏ phiếu, nhưng tôi đã đúng. Cảm ơn đã cung cấp cú pháp cho Swift.
Matt Long

Đẹp! Nó hoạt động! cảm ơn bạn! Tôi đang cố gắng giải quyết vấn đề này trong 3 giờ.
mr_ivan777

Đặt mã này ở đâu? i tải dữ liệu cốt lõi với mã này chúng ta hãy container = NSPersistentContainer (tên: "modeldb") container.loadPersistentStores (completionHandler: {(storeDescription, lỗi) nhập nếu let lỗi = lỗi như NSError {?
MAS John.

5

Hãy thử "Đặt lại nội dung và cài đặt" trong trình giả lập. Làm việc cho tôi sau khi xóa ứng dụng và xây dựng sạch


3
Tuy nhiên, nếu bạn làm điều này, vấn đề tương tự vẫn xảy ra với người dùng trên máy thật?
Maury Markowitz

4

Tôi gặp vấn đề tương tự với ứng dụng của mình (chưa được phát hành trong App Store).

Đây là cách tôi sửa nó:

  1. Chạy sạch (Cmd + Shift + K)
  2. Khởi động lại Trình mô phỏng iOS
  3. Trình mô phỏng iOS -> Đặt lại Nội dung và Cài đặt (từ thanh điều hướng)

(3) là bước cuối cùng đã khiến nó chạy đúng. Hi vọng điêu nay co ich!


2

Mặc dù đôi khi bạn chỉ có thể xóa ứng dụng khỏi thiết bị khi thay đổi lược đồ trong mô hình đối tượng được quản lý, trong một số trường hợp, điều này là không thể, ví dụ như vì bạn đã xuất bản ứng dụng của mình với một lược đồ cũ.

Nếu đây là trường hợp, bạn phải chăm sóc di chuyển dữ liệu cũ sang lược đồ mới:

Phiên bản mô hình dữ liệu cốt lõi và di chuyển dữ liệu


2

Bạn sẽ cần di chuyển mô hình Dữ liệu lõi bằng cách di chuyển. Bất cứ khi nào bạn thay đổi mô hình, bạn làm cho nó không tương thích mà không cần phiên bản. Dây buộc mình vào, đó là một chủ đề lông.

http://developer.apple.com


2

Nếu bạn thay đổi mô hình Dữ liệu lõi của mình, bạn phải cung cấp chính sách di chuyển để cho Core Data biết cách áp dụng các đối tượng tồn tại (mà người dùng của bạn đã tạo với phiên bản hiện được phát hành) cho mô hình mới.

Đối với một số kịch bản, Dữ liệu lõi có thể tự động suy ra ánh xạ từ mô hình cũ sang mô hình mới. Đối với những thay đổi phức tạp hơn, bạn có thể phải thực hiện một số logic thực hiện di chuyển.

Chi tiết có thể được tìm thấy trong Hướng dẫn lập trình di chuyển dữ liệu và mô hình dữ liệu lõi .

Cập nhật
Câu trả lời này tại đây trên Stack Overflow bao gồm những điều cơ bản về di chuyển nhẹ của Core Data và cũng có một số mã để bạn bắt đầu.


Đây là câu trả lời của tôi cho việc di chuyển dữ liệu: stackoverflow.com/questions/8881453/ trên
Dhaval H. Nena

1

Vấn đề này thường xảy ra do sự không tương thích giữa phiên bản mà DB đã được tạo. Cách tiếp cận chung cho vấn đề này là xóa ứng dụng và cài đặt lại . Nhưng trong trường hợp được đề cập của bạn, phiên bản DB hoàn toàn khác nhau trên Xcode 3.2 và 4.2. Vì vậy, tốt hơn nên sử dụng cùng một phiên bản Xcode cho DB.


1

Đầu tiên, những thứ duy nhất nên có trong xcdatamodeldgói là xcdatamodelcác tệp. Các lớp con của bạn KHÔNG nên ở trongxcdatamodeld . Di chuyển những người ra khỏi đó. Có một cơ hội công bằng họ đang nhầm lẫn trình biên dịch.

Thứ hai, lỗi chỉ ra rằng Dữ liệu lõi không thể tìm thấy mô hình của bạn. Bạn đã tạo dữ liệu và sau đó chạm vào mô hình? Nếu vậy, bạn đang ở trạng thái không nhất quán và cần khắc phục điều đó bằng cách xóa dữ liệu (mà Philippe đã đề xuất) hoặc bằng cách cuộn các thay đổi của mô hình BACK .


Bạn có biết làm thế nào tôi có thể lấy mô hình ra khỏi gói xcdatamodel không? hoặc shd tôi chỉ cần xóa nó?
dejoong

Các mô hình, đó là các xcdatamodeltập tin nên có trong đó. Đây là tập tin .h và .m cần được di chuyển. Sử dụng Finder.
Marcus S. Zarra

0

Tôi đã nhận được lỗi nhưng lý do tôi nhận được lỗi là do sau đây.

Ban đầu tôi có một Thực thể có tên "Entry" và có một hàng được lưu cho thực thể đó trong cơ sở dữ liệu. Sau đó tôi đã thêm một Thực thể khác có tên "Người" và sau khi thêm vào đó, chúng tôi đã xây dựng và gặp lỗi. Vì vậy, tôi đã giải quyết vấn đề bằng cách xóa Thực thể "Người" và sau đó xây dựng ứng dụng, xóa hàng nằm trong "Mục nhập" và sau đó đóng ứng dụng. Sau đó tôi đã xóa ứng dụng hoàn toàn khỏi điện thoại của mình và sau đó xây dựng lại và nó hoạt động tốt. Không chắc bước nào đã khắc phục sự cố (xóa hàng hoặc ứng dụng), nhưng hy vọng nếu bạn đang tìm giải pháp thì điều này sẽ giúp ích. :)

Chỉnh sửa: Ồ và nếu bạn lo lắng về việc xóa Thực thể mới (trong trường hợp của tôi là "Người") để xây dựng lại ứng dụng, hãy nhớ rằng bạn có thể lấy lại ứng dụng sau đó bằng cách sử dụng CMD + Z!


0

Tôi gặp vấn đề này - trước tiên tôi đặt lại trình giả lập của mình và sau đó dọn dẹp dự án và xây dựng lại. Và sau đó nó hoạt động.


0

Khi bạn thay đổi dữ liệu cốt lõi, (thêm một trường vào bảng, xóa trường, v.v.), tệp sqlite trong thư mục tài liệu ứng dụng cần phải được đồng bộ hóa với lược đồ của bạn.

Tập tin này không được ghi đè theo mặc định, tập tin này cần phải được tạo lại.

Thực hiện theo các bước sau:

  1. Chuyển đến thư mục được chỉ bởi NSURL. (Đường dẫn này có thể được tìm thấy trong thông báo ngoại lệ được tạo bởi ứng dụng trước khi gặp sự cố.) Ví dụ: / Users // Library / Application Support / iPhone Simulator // Application // Documents

  2. xóa hoặc đổi tên tập tin sqlite

  3. Làm sạch và chạy lại ứng dụng
  4. Ứng dụng chạy lại sẽ tạo ra một tệp sqlite mới.

Điều này sẽ đảm bảo rằng lược đồ và Xcode được đồng bộ hóa.


-1

Để phát triển ứng dụng mac:

  1. Làm sạch dự án
  2. Làm sạch dữ liệu dẫn xuất
  3. Truy cập / Users / YOU_NAME / Library / Container / YOU_APP_BUNDLE_ID / Dữ liệu / Tài liệu / và xóa tất cả các tệp bên trong (chẳng hạn như ".sqlite", ".sqlite-shm" ...)

Nó làm việc cho tôi, hy vọng điều này có thể hữu ích.


-2

Trình mô phỏng iOS -> Đặt lại nội dung và cài đặt ...

Đã làm cho tôi

Trình mô phỏng iOS -> Đặt lại nội dung và cài đặt ... -> Đặt lại hoạt động trên iOS9 (xcode 7.1)


4
thực hành không tốt trong sản xuất, làm hỏng ứng dụng
Eduardo Oliveros
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.