Tôi phải làm gì để Dữ liệu cốt lõi tự động di chuyển mô hình?


96

Tôi đã đọc tài liệu về di chuyển tự động / nhẹ cho các mô hình Dữ liệu lõi - nhưng tôi đang gặp sự cố khi triển khai nó.

Theo tôi hiểu, ứng dụng sẽ nhận thấy rằng mô hình mà nó có và mô hình đã tồn tại trên một thiết bị không giống nhau. Nếu bạn chỉ thêm thuộc tính hoặc mối quan hệ và những thay đổi đơn giản tương tự thì mô hình sẽ được nâng cấp tự động.

Bất kỳ gợi ý nào - tôi có cần thiết lập thứ gì đó trong Xcode không?

Câu trả lời:


138

Bây giờ tôi đã phát hiện ra rằng điều này khá đơn giản - một khi bạn biết nơi để tìm.

Trong AppDelegate của mình, tôi đã thiết lập NSPers phù hợpStoreCoordinator - và bạn cần thêm một số tùy chọn vào điều này để yêu cầu nó xử lý tự động di chuyển:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,

[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

NSError *error;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    // Handle error
    NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}

Sau đó, bạn cần thực hiện một thủ thuật nhỏ trong xCode:

  1. Chọn tệp xcdatamodel của bạn
  2. Chọn Menu thiết kế ở trên cùng - sau đó chọn Mô hình dữ liệu - sau đó chọn Thêm phiên bản mô hình
  3. Sau đó, tệp xcdatamodel của bạn sẽ được chuyển vào một thư mục mới có cùng tên với tệp xcdatamodel của bạn nhưng có phần mở rộng là xcdatamodeld - sẽ có tệp thứ hai trong thư mục này với số 2 trong tên. Chọn tệp mới và sau đó Thiết kế-> Mô hình dữ liệu-> Đặt phiên bản hiện tại ( trong Xcode 4, bạn làm điều này )
  4. Nếu bạn đã thực hiện các thay đổi khiến dự án của bạn không tương thích - hãy loại bỏ những thay đổi này khỏi tệp xcdatamodel ban đầu. Nếu bạn vẫn chưa thực hiện thay đổi - thì chỉ cần chỉnh sửa tệp 2.xcdatamodel (tệp bạn vừa tạo phiên bản hiện tại).
  5. Bây giờ khi bạn cài đặt phiên bản này vào một thiết bị có kiểu cũ - nó sẽ tự động nâng cấp kiểu đó lên kiểu mới.

Điều này có vẻ tuyệt vời và đơn giản như tôi muốn - nhưng tôi nghĩ bạn cần phải cẩn thận trong quá trình phát triển khi bạn thay đổi một mô hình - nếu không bạn sẽ phải tạo một phiên bản mới cho mỗi thay đổi.

Tôi nghĩ những gì tôi sẽ làm là tôi sẽ giữ tất cả các tệp đã thay đổi và sau đó khi tôi sẵn sàng triển khai bản cập nhật của mình, tôi sẽ xóa tất cả các tệp ở giữa và chỉ triển khai với các mô hình cũ nhất và mới nhất.


CẬP NHẬT (15/07/2011):

Cảm ơn @ rockstarberlin đã chỉ ra rằng có tài liệu cập nhật tại apple:

Xcode 4: Đặt phiên bản hiện tại của mô hình đối tượng được quản lý

Cập nhật: 19/08/2013 liên kết tốt hơn:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersinstall/Articles/vmModelFormat.html


Tôi khuyên bạn nên đọc Hướng dẫn tạo phiên bản và di chuyển dữ liệu cốt lõi, có sẵn trong trình xem tài liệu Xcode và trên developer.apple.com.
Hunter

1
Tôi không tìm thấy câu trả lời trong đó đơn giản - phải mất một lúc để tìm ra cách thực hiện điều này.
Grouchal

NSInferMappingModelAutomaticallyOption hoạt động tốt, nhưng chỉ đối với các ánh xạ đơn giản, chẳng hạn như thay đổi tên của một thuộc tính. Đối với bất kỳ điều gì phức tạp hơn (mối quan hệ, xóa hoặc thêm thực thể), bạn sẽ cần thêm một mô hình ánh xạ. Nếu Xcode phàn nàn rằng NSInferMappingModelAutomaticallyOption không được khai báo, hãy thêm #import <CoreData / CoreData.h> vào tệp tiêu đề đại biểu ứng dụng của bạn.
Elise van Looij 29/09/09

Tôi đã thêm một số thực thể vào mô hình của mình và nhận được lỗi "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". Giải pháp của bạn đã sửa nó! Cảm ơn rât nhiều!
Karsten Silz

1
Xem câu trả lời của Santthosh bên dưới nếu bạn gặp 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 tên" sau khi làm theo các hướng dẫn này.
benvolioT

14

Điều này vô cùng hữu ích. Tài liệu của Apple - như thường lệ - không đầy đủ. Tôi khuyên bạn nên thực hiện một bản dựng sạch sẽ, vì tôi đã gặp lỗi "Không thể hợp nhất các mô hình với hai thực thể khác nhau xxx" khi lần đầu tiên tôi chạy sau khi thực hiện những thay đổi này. Bản dựng sạch đã sửa nó lên.


Một bản dựng sạch cũng đã khắc phục sự cố của tôi.
jrainbow 13/09/09

6

Câu trả lời của Grouchal là hoàn hảo ... nhưng nếu bạn vẫn gặp lỗi "Không thể hợp nhất các mô hình với hai thực thể khác nhau xxx" ngay cả sau khi dọn dẹp bản dựng vài lần ... Bạn có thể gặp vấn đề với cách tải ManagedObjectModel .. .Hãy nhìn cái này ... đã giúp tôi sửa nó ..

vấn đề di chuyển dữ liệu cốt lõi


3

Ngoài ra, nếu bạn tình cờ gặp bài đăng này, giống như tôi đã làm, sau khi nhận được lỗi "Kiểu được sử dụng để mở cửa hàng không tương thích với kiểu được sử dụng để tạo cửa hàng" và bạn chỉ đang gỡ lỗi bằng trình mô phỏng và muốn thay thế hoàn toàn đã cài đặt mô hình cũ, bạn chỉ có thể Đặt lại ứng dụng Trình mô phỏng hoặc xóa ứng dụng của bạn khỏi trình mô phỏng cũng có thể hoạt động.

Tôi đã không thử điều này cho đến khi đọc các bài đăng ở đây, lúc đó tôi nhận ra rằng tôi đã cài đặt ứng dụng trong trình mô phỏng và sau đó thay đổi mô hình, gây ra lỗi thời gian chạy nói trên.


1

Để theo dõi câu trả lời của Santthosh, thay vào đó tôi sẽ đăng đoạn mã ngay tại đây. Bạn cần tạo ManagedObjectModel của mình initWithContentsOfURL:thay vì mergedModelFromBundles:nếu không, bạn sẽ gặp lỗi:

Không thể hợp nhất các mô hình với hai thực thể XXX và XXX khác nhau

Nếu tệp Mô hình của bạn có tên "Mô hình", đây là cách bạn tạo ManagedObjectModel:

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

Tín dụng cho bài đăng trên blog này .



1

Tôi đã gặp vấn đề này trong nhiều năm và tôi đã thử tất cả các câu trả lời này đều không có kết quả. Hôm nay cuối cùng tôi cũng nhận ra mình đã làm gì sai. Vấn đề rất đơn giản, nhưng tôi đã bỏ qua nó. Khi tạo phiên bản mới hơn của mô hình dữ liệu, nếu bạn đang THÊM các cột, hãy nhớ đánh dấu chúng là TÙY CHỌN. Nếu bạn không thực hiện, việc di chuyển đơn giản sẽ không hoạt động vì các giá trị cột mới sẽ không được điền vào.

Ngay sau khi tôi đảm bảo rằng các cột mới của mình đã được chọn "tùy chọn", tôi đã thử di chuyển lại và nó hoạt động.


1

Tôi tình cờ xem được bài đăng này vì một vấn đề khác, nhưng lỗi là " Cấu hình mô hình được sử dụng để mở cửa hàng không tương thích với cấu hình được sử dụng để tạo cửa hàng. "

Đây là vấn đề của tôi và giải pháp cho nó. Trong mô hình của tôi, tôi đã sử dụng các cấu hình . Tôi có một số thực thể được lưu trữ trong một tệp và những thực thể khác trong tệp thứ hai. (Tôi có một số mặc định có thể cần tải xuống theo định kỳ và sẽ là một điều khó tin khi hợp nhất chúng thành toàn bộ). Nhưng dù sao, tôi đã tạo ra một thực thể mới. Chương trình dường như chạy tốt, nhưng bất cứ khi nào tôi thoát ra, tôi đều gặp lỗi ở trên.

Giải pháp ở đó là xem xét các cấu hình của tôi, nhận ra rằng tôi có một thực thể hiện không có trong bất kỳ cấu hình nào và thêm nó vào một cấu hình. Chạy như một giấc mơ.

Điều này sẽ không khắc phục được sự cố của OP. Nhưng có thể một số người thất vọng đến đây qua google sẽ ở trong con thuyền mà tôi đã ở :)


0

iOS 4.0+

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"model" withExtension:@"momd"];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

0

Chỉnh sửa nhỏ đối với các hướng dẫn tuyệt vời của @ Grouchal ở trên cho Xcode phiên bản 5:

Cũ: 2. Chọn Menu Thiết kế ở trên cùng - sau đó đến Mô hình Dữ liệu - sau đó chọn Thêm Phiên bản Mô hình

Phiên bản 5+: 2. Chọn menu Trình chỉnh sửa, sau đó Thêm Phiên bản Mô hình…, nhập tên Phiên bản của bạn và Dựa trên kiểu máy (chọn kiểu máy ban đầu của bạn từ danh sách)

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.