2012-07-21 27 views
71

Tôi đã thêm tất cả mã có liên quan vào App Delegate và tôi có thể thêm vào mô hình dữ liệu và tìm nạp từ mô hình dữ liệu trong applicationDidFinishLaunchingWithOptions.'+ entityForName: nil không phải là tham số NSManagedObjectContext hợp pháp - Dữ liệu cốt lõi

Sự cố của tôi xuất hiện khi tôi cố ghi vào mô hình dữ liệu trong Trình điều khiển chế độ xem của mình. Tôi đã thêm mã này vào file header:

NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 

Và mã này vào tập tin thực thi của tôi:

NSManagedObjectContext *context = [self managedObjectContext]; 
NSManagedObject *model = [NSEntityDescription 
          insertNewObjectForEntityForName:@"Events" 
          inManagedObjectContext:context]; 
[model setValue:@"Sample Event" forKey:@"eventName"]; 

NSError *error; 
if (![context save:&error]) { 
    NSLog(@"Couldn't save: %@", [error localizedDescription]); 
} 

Tuy nhiên, tôi nhận được lỗi sau:

'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Events'' 

Có ai biết chuyện gì vậy? Bất kỳ trợ giúp sẽ được đánh giá cao.

+12

Tôi nghĩ ngữ cảnh là không. Hãy chắc chắn rằng [self managedObjectContext] không trả về nil – mask8

+1

Lưu ý vì lý do của hậu thế, bạn có thể gặp lỗi này nếu bạn chuyển ivar cho ManagedObjectContext thay vì sử dụng phương thức getter – Matthematics

Trả lời

36

Nếu bạn đang sử dụng segues bạn sẽ nhận được những vấn đề tương tự nếu bạn không vượt qua bối cảnh xuống dòng. Sử dụng mã này trong phương pháp prepareForSegue của lớp khởi sự segue:

[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext]; 

Đó là giả định bạn giữ ngữ cảnh của bạn trong một tài sản gọi là "managedObjectContext" tất nhiên rồi.

+1

Tôi đặt nó thành _managedObjectContext và nó bị treo. self.mangeObjectContext giải quyết nó. Cảm ơn! –

+0

Vui vì nó hoạt động! Tôi tin rằng, hãy đăng Xcode 4.4, nếu bạn chỉ sử dụng "@synthesize myProperty;" trình biên dịch tạo ra một biến cá thể gọi là "myProperty" chứ không phải là "_myProperty". Nếu bạn không sử dụng "@synthesize", bạn sẽ nhận được "_myProperty". Vì vậy, "_managedObjectContext" có thể không thực sự tồn tại. Tôi không biết vì tôi không thể nhìn thấy bạn mã. "self.managedObjectContext" là an toàn vì nó gọi accessor như nó luôn luôn có. – Tim

46

Tôi đã quên chuyển ngữ cảnh đến trình điều khiển chế độ xem. Lỗi tân binh.

+0

và đây là cách để chuyển ngữ cảnh tới trình điều khiển xem: AppDelegate * appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; context = [appDelegate managedObjectContext]; –

45

Bạn có thể vượt qua hoàn cảnh bằng cách bao gồm các mã sau đây trước khi bạn bắt đầu để lấy dữ liệu hình thành cơ sở dữ liệu:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate]; 
context = [appDelegate managedObjectContext]; 
+0

Cảm ơn đoạn trích nhỏ đẹp này .. Tôi không bao giờ có thể nhớ cú pháp đầy đủ! – RyanG

20

bạn nên thêm video này vào viewController của bạn:

id delegate = [[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext = [delegate managedObjectContext]; 
0

Nếu bộ điều khiển xem đích được nhúng trong một NavigationController, bối cảnh cần phải được thiết lập một cách thích hợp như sau-

self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0]; 
[self.mydetailViewController setManagedObjectContext:self.managedObjectContext]; 
2

tôi nhận này vấn đề và một đồng nghiệp đã giúp tôi. Nếu bạn nhận được thông báo lỗi này: "entityForName: nil không phải là tham số hợp pháp NSManagedObjectContext tìm kiếm tên tổ chức". Và bạn đã thực hiện các thay đổi trong mô hình coredata. Tôi nghĩ rằng vấn đề có thể không phải là mã số.

Giải pháp có thể đơn giản. Hãy thử một trong các tùy chọn sau:

  • Chỉ cần xóa ứng dụng khỏi thiết bị bạn đang thử nghiệm, cần có phiên bản cũ của mô hình.
  • Tạo một phiên bản cơ sở dữ liệu khác bằng cách sử dụng Xcode,> Trình soạn thảo> Thêm phiên bản mô hình.

Hy vọng điều đó sẽ hữu ích.

1

Trong trường hợp của tôi .xcdatamodeld đã bị nhầm trong appdelegate:

let container = NSPersistentContainer(name: "name of data model") 
0

Tôi là một fan hâm mộ của khởi lười biếng. Bằng cách này, nếu bạn cần tiêm một ngữ cảnh mới để thử nghiệm bạn có thể, hoặc nó sẽ nhận được ngữ cảnh của nó từ đại biểu ứng dụng nếu bạn thiết lập MOC của bạn ở đó.

class.h 
@property (strong, nonatomic,getter=getManagedObjectContext) NSManagedObjectContext *managedObjectContext; 

class.m 
    -(NSManagedObjectContext *)getManagedObjectContext { 
     if (_managedObjectContext) { 
      return _managedObjectContext; 
     } 
     _managedObjectContext = [[(AppDelegate *)[[UIApplication sharedApplication]delegate]sharedDataModel]managedObjectContext]; 
     return _managedObjectContext; 
    } 
Các vấn đề liên quan