2012-09-27 24 views
6

Tôi nhận được lỗi 'Cannot create an NSPersistentStoreCoordinator with a nil model' sau khi xóa ứng dụng của mình khỏi thiết bị. Tôi đang thử nghiệm một ứng dụng iPhone trên thiết bị iPad. Tôi đã đặt mã này để kiểm tra xem tôi có tập tin trong AppDelegate.m:Không thể tạo NSPersistentStoreCoordinator với mô hình nil sau khi xóa ứng dụng khỏi thiết bị

- (NSManagedObjectModel *)managedObjectModel { 
    if (__managedObjectModel != nil) { 
     return __managedObjectModel; 
    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Name" withExtension:@"momd"]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:[modelURL path]]) { 
     NSLog(@"%@", [modelURL path]); //This is printed because file exists 
    } 
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
    return __managedObjectModel; 
} 

Vấn đề là [NSManagedObjectModel initWithContentsOfURL] đang trở lại giá trị nil. tôi đã thực hiện những điều sau đây, không có thành công:

  1. Thay đổi managedObjectModel instantiation với __managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
  2. sạch thư mục xây dựng này và dự án làm sạch
  3. : Khởi động lại Xcode
  4. máy tính Khởi động lại
  5. Changed "momd "to" mom "
  6. .xcdatamodeld nằm trong Tài nguyên và các nguồn biên dịch sao chép
  7. đổi tên .xcdatamodeld và làm sạch và đóng cửa dự án Xcode nhiều lần
  8. tắt và trên thiết bị
  9. thư mục Deleted từ: $ cd /Users/john/Library/Developer/Xcode/DerivedData
  10. Thay đổi tên SQLite để buộc hệ cơ sở dữ liệu
  11. xóa (một lần nữa) ứng dụng từ devine

Tôi đã tìm kiếm giải pháp hàng giờ và tôi vẫn không thể tìm thấy nó.

+0

Liệu nó có hoạt động trên trình giả lập không? Bạn có thể mở tệp '.xcdatamodeld' trong Xcode không? – FluffulousChimp

+0

Alan, tôi có thể mở tệp '.xcdatamodeld' trong Xcode, nhưng ứng dụng không hoạt động trong trình mô phỏng. Nó khởi chạy, nhưng chỉ hiển thị một màn hình màu đen. – amb

+0

Tôi nghĩ rằng tôi đã tìm thấy một cái gì đó ... Tôi vừa mới nhận ra rằng tôi đã không xóa tất cả các tập tin đang sống trong '/ Users/john/Library/Developer/Xcode/DerivedData', vì vậy khi tôi thực hiện điều này , ngay cả managedObjectModel. Có cách nào để xóa các tệp này trong thiết bị không? – amb

Trả lời

15

Cuối cùng, sau hai ngày cố gắng giải quyết vấn đề này, tôi đã tìm thấy các giải pháp ở đây:

How to create the magic .xcdatamodeld folder/package?

bây giờ tôi đang hoàn thành một dự án mà nhà phát triển khác bắt đầu, và có vẻ như vì không 't đẩy những thay đổi mới nhất cho repo, nhưng những thay đổi đó là trong ứng dụng trong thiết bị và khi tôi xóa ứng dụng, tôi đã xóa tệp .xcdatamodeld đúng. Vấn đề là tôi chỉ có một tập tin MyApp.xcdatamodel trong dự án, và đây là lý do có một thư mục trống momd.

Để tạo hệ thống phân cấp bên phải của mô hình dữ liệu, giải pháp khá đơn giản:

  1. Chọn MyApp.xcdatamodel
  2. Đến Editor> Thêm mẫu Version ...

Và điều này đã nhúng tệp MyApp.xcdatamodel vào MyApp.xcdatamodeld. Bây giờ thư mục momd có các tệp mom và ứng dụng chạy OK. Vấn đề duy nhất bây giờ là tôi có hai MyApp.xcdatamodel, một với một biểu tượng được chọn màu xanh lá cây, nhưng cả hai đều có cùng nội dung nên không có vấn đề gì.

1
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"select xcdatamodeld" withExtension:@"momd"]; 

chọn url chính xác cho tên tài nguyên ..

0

nó tương đối đơn giản.

nếu bạn có tệp xcdatamodel mà không cần phiên bản: hãy sử dụng phần mở rộng "mẹ" trong khai báo managedObjectModel của bạn. Nếu xcdatamodel của bạn có phiên bản, bạn nên sử dụng "momd".

2

Tôi đã được sao lưu để tạo lại ứng dụng iOS đầu tiên của mình. Hôm nay, tôi nhận được lỗi này: 'Không thể tạo một NSPersistentStoreCoordinator với một mô hình nil'. Thực ra, điều đó rất dễ sửa. Hãy dòng mã này:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[name]" withExtension:@"momd"]; 

Các [name] bạn điền vào là giống như mô hình tập tin của bạn (.xcdatamodeld). Ví dụ: tôi có một TipRecord.xcdatamodeld thì dòng này phải là:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TipRecord" withExtension:@"momd"]; 
Các vấn đề liên quan