2009-11-23 11 views
10

Tôi thiết lập thực thể bằng trình chỉnh sửa tệp Xcode .xcdatamodel. Tôi đã tạo một thực thể có tên là Person, thêm một vài thuộc tính, sau đó tạo một tệp .m để biểu diễn nó. Tất cả đều hoạt động tốt.insertNewObjectForEntityForName:

Bây giờ khi tôi đi để viết một dòng mã như:

 
    Person * person = (Person*)[NSEntityDescription 
         insertNewObjectForEntityForName:@"Person" 
         inManagedObjectContext:managedObjectContext]; 

Và tôi nhận được:

Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInternalInconsistencyException', lý do: '+ entityForName: không thể xác định vị trí một NSManagedObjectModel cho tên thực thể 'Person' '

Tôi đã làm theo ví dụ về Vị trí chính xác, bước-cho-bước mà tôi tin, nhưng tôi nghĩ rằng tôi phải đã bỏ lỡ một số loại quan trọng "đăng ký" bước mà tôi nói với Xcode rằng thực thể Person của tôi nên được truy cập .. Ngoài ra tôi đã không có một cách để "khởi tạo" các managedObjectContext ở tất cả, ví dụ địa điểm dường như không làm nó cũng không phải.

Trả lời

15

Thực tế là bạn không thiết lập MOC gần như chắc chắn là vấn đề. Đặc biệt nhất, nó có nghĩa là bạn có thể không tải MOM của bạn (Mô hình đối tượng được quản lý) định nghĩa Person. Một nơi nào đó trong mã của bạn, bạn nên có một cái gì đó như thế này:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  

Và một cái gì đó như thế này:

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

Và một cái gì đó như thế này:

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
if (coordinator != nil) { 
    managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [managedObjectContext setPersistentStoreCoordinator: coordinator]; 

Tôi chỉ cần sao chép đường ra khỏi AppDelegate của mẫu Dữ liệu cốt lõi (những gì bạn nhận được nếu bạn tạo một ứng dụng mới sử dụng Dữ liệu cốt lõi).

Nếu bạn có tất cả những điều đó, hãy đảm bảo rằng xcdatamodel của bạn được liệt kê trong bước Biên dịch của công cụ xây dựng. Và tất nhiên hãy chắc chắn rằng Person thực sự là tên thực thể trong xcdatamodel của bạn. Tên thực thể không giống với Lớp, mặc dù chúng thường được đặt là giống nhau.

3

Bạn cần init của Core Dữ liệu

-(void)initCoreData{ 
     NSError *error; 
     //Path to sqlite file. 
     NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Level4.sqlite"]; 
     NSURL *url = [NSURL fileURLWithPath:path]; 

     //init the model 
     NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 

     //Establish the persistent store coordinator 
     NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]; 

     if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]){ 

       NSLog(@"Error %@",[error localizedDescription]); 

     }else{ 
       self.context = [[[NSManagedObjectContext alloc ] init ] autorelease]; 
       [self.context setPersistentStoreCoordinator:persistentStoreCoordinator]; 
     } 

     [persistentStoreCoordinator release]; 
} 
2

Bạn nên kiểm tra nếu đối tượng NSManagedObjectContext là con số không.

ví dụ:

if (self.managedObjectContext == nil) { 
    NSLog(@"NSManagedObjectContext is nil"); 
    return nil; 
} 
+0

Điều này đã giúp nhắc tôi rằng tôi đã không vượt qua NSManagedObject của mình để xem tiếp theo, đó là lý do tôi nhận được lỗi ở trên. Cảm ơn! – JasonBub

Các vấn đề liên quan