2012-03-19 17 views
6

Tôi bắt đầu sử dụng CoreData trong ứng dụng của mình sau bài học Stanford CS193P về việc sử dụng lớp UIManagedDocument mới của iOS 5. Cách tiếp cận chính nó là khá đơn giản nhưng tôi không thể hiểu làm thế nào để đối phó với các sửa đổi mô hình tôi tiếp tục làm. Đây là cách tôi nhanh chóng đối tượng UIManagedDocument của tôi (bên trong appdelegate, để mỗi lớp khác có thể sử dụng nó):Sự cố di chuyển với UIManagedDocument

if (!self.database) { 
    NSURL *url=[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:@"AppName"]; 

    UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:url]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
    doc.persistentStoreOptions = options; 
    self.database=doc; 
    [doc release]; 
} 

Vấn đề tôi có là mỗi khi tôi thay đổi ngay cả một chút .xcdatamodel của tôi, tôi không thể nhận được tất cả nội dung được lưu trữ trước đó trong tài liệu cũng như để tạo bất kỳ cá thể mới nào. Thực tế là việc này tạo ra ngoại lệ sau:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.' 

Tôi nghĩ rằng thuộc tính "tùy chọn" của tài liệu được quản lý sẽ giải quyết được vấn đề, nhưng dường như điều này là chưa đủ. Bất cứ ai cũng có thể giúp đỡ? Không thể 'tìm các câu hỏi khác thực sự phù hợp với nhu cầu chính xác của tôi.

+0

Tôi cũng theo dõi Stanford CS193P và tôi cũng gặp lỗi tương tự. – coolcool1994

Trả lời

2

Trước khi bạn sửa đổi mô hình Dữ liệu cốt lõi, bạn nên "Thêm phiên bản mô hình".

1. Chọn tệp mô hình gốc. (ví dụ: YourProject.xcdatamodel)

2. "Editor" -> "Add Model Version ...". Sau đó, thêm phiên bản mô hình mới (ví dụ: 2.0)

3. Bạn sẽ nhận được một tệp mô hình mới. (ví dụ: YourProject 2.0.xcdatamodel). Sửa đổi nó.

4. Thay đổi phiên bản mô hình hiện tại. Chọn tệp .xcdtatmodel trên cùng -> "Xem" -> "Tiện ích" -> "Hiển thị trình kiểm tra tệp". Tìm thẻ "Mô hình dữ liệu lõi được phiên bản" và chọn phiên bản phù hợp bạn muốn sửa đổi.

Nó cũng làm phiền tôi trong một thời gian dài. Hy vọng cách này có thể giúp bạn ^^

+0

Xin chào. Cảm ơn bạn đã trả lời. Có vẻ như là cách tốt để đi. Dù sao, sau khi làm theo gợi ý của bạn, tôi tiếp tục nhận được vấn đề di cư: *** Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInvalidArgumentException', lý do: 'Không thể hợp nhất các mô hình với hai thực thể khác nhau có tên là 'ManagedChild'' nơi ManagedChild là một trong những thực thể trong mô hình của tôi. Tôi tìm thấy [mục này] (http://stackoverflow.com/questions/3205783/core-data-error-cant-merge-models-with-two-different-entities-named-foo) nhưng nó không sử dụng Samy UIManagedDocument phương pháp tiếp cận như tôi cần ... – micamoita

+0

Tôi nhận được cùng một vấn đề. Tất cả tài liệu nói rằng việc thêm "persistentStoreOptions" là cách để đi. Nhưng tôi nhận được một nil trở về từ UIManagedDocument cùng với các thông báo lỗi tương tự. Việc xóa cửa hàng không phải là tùy chọn hợp lệ cho tôi vì tôi đang hỗ trợ ứng dụng đã phát hành. –

+0

Chỉ cần một điểm dữ liệu khác ...Tôi đã tạo một dự án mẫu đang khởi tạo dữ liệu lõi thông qua UIManagedDocument giống như cách tôi đang làm trong ứng dụng của mình, nhưng dự án mẫu dường như di chuyển tốt (thậm chí không có bất kỳ persistentStoreOptions) nào. –

0

Có một giải pháp thực sự đơn giản cho vấn đề của bạn. Chỉ cần xóa ứng dụng khỏi trình mô phỏng hoặc thiết bị (chạm vào biểu tượng ứng dụng trong vài giây và chạm vào hình chữ thập xuất hiện khi biểu tượng ứng dụng bắt đầu vặn vẹo). Bằng cách đó, Xcode cập nhật UIManagedDocument của ứng dụng của bạn.

+1

và nếu ứng dụng đã có trong cửa hàng. bạn hiển thị chế độ xem cảnh báo và yêu cầu người dùng cài đặt lại ứng dụng của bạn? – MrBr

+0

Tôi nghĩ rằng câu trả lời của pH-k là những gì người hỏi cần kể từ khi anh ta đang theo một hướng dẫn, không phải để xuất bản một ứng dụng cho cửa hàng :) – Philip007

+0

điều này đã không giúp tôi. Cửa hàng liên tục không có sẵn, nhưng tôi rõ ràng có nó! – coolcool1994

0

Đảm bảo rằng bạn không nhập nhầm NSDocumentDirectory dưới dạng NSDocumentationDirectory.

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 

NSDocumentDirectory is right!