Tôi đang sử dụng dự án mẫu CoreDataBooks của Apple như một trợ giúp học tập cho dữ liệu cốt lõi.Core-Data iPhone: không thể định vị một NSManagedObjectModel
Tôi đã sửa đổi ứng dụng để khi tải ứng dụng tôi hiển thị trang menu trước tiên - không phải bảng xem sách (RootViewController).
Tôi đã làm như sau:
Tôi tạo ra một trang trình đơn trong xây dựng giao diện (chỉ cần một cái nhìn với một nút trên nó)
Các CoreDataBooksAppDelegate.h bây giờ trông như thế này:
// for the menu
@class MenuViewController;
@interface CoreDataBooksAppDelegate : NSObject <UIApplicationDelegate> {
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
UIWindow *window;
UINavigationController *navigationController;
//for the menu
MenuViewController *viewController;
}
- (IBAction)saveAction:sender;
//for the menu
@property (nonatomic, retain) IBOutlet MenuViewController *viewController;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, readonly) NSString *applicationDocumentsDirectory;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@end
Các CoreDataBooksAppDelegate.m trông như thế này:
#import "CoreDataBooksAppDelegate.h"
#import "RootViewController.h"
// for the menu
#import "MenuViewController.h"
@implementation CoreDataBooksAppDelegate
@synthesize window;
@synthesize navigationController;
// for the menu
@synthesize viewController;
#pragma mark -
#pragma mark Application lifecycle
- (void)applicationDidFinishLaunching:(UIApplication *)application {
RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
rootViewController.managedObjectContext = self.managedObjectContext;
// for the menu
[window addSubview:viewController.view];
// Configure and show the window
[window makeKeyAndVisible];
}
Phần còn lại của CoreDataAppDelegete.m vẫn không thay đổi.
Trong MenuViewController khi nút được nhấn vào, hành động sau đây xảy ra:
RootViewController *modalViewController1 = [[[RootViewController alloc] initWithNibName:nil bundle:nil] autorelease];
[self presentModalViewController:modalViewController1 animated:YES];
Trong IB Tôi đã thay đổi MainWindow.xib gọi MenuViewController chứ không phải là RootViewController.
Vì vậy, ứng dụng sẽ tải và menu được hiển thị đúng cách bằng nút. Khi nhấp vào nút, ứng dụng gặp sự cố bên trong chế độ xemViewDidLoad của RootViewController.
Nó bị treo ngay tại đây:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"1 START viewDidLoad RootViewController");
self.title = @"Books";
// Set up the edit and add buttons.
self.navigationItem.leftBarButtonItem = self.editButtonItem;
NSLog(@"2 setup button viewDidLoad RootViewController");
// Configure the add button.
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addBook)];
self.navigationItem.rightBarButtonItem = addButton;
[addButton release];
NSLog(@"3 viewDidLoad RootViewController");
NSError *error;
// HERE IS THE CRASH SITE
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Does not reach this point in viewDidLoad RootViewController");
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort(); // Fail
}
NSLog(@"END viewDidLoad RootViewController");
}
Trong giao diện điều khiển tôi nhận được như sau:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Book''
Tôi đã đọc về ngoại lệ này, nhưng tôi không biết các bước thích hợp để giải quyết nó.
Xin chào. Tôi đã đi xa đến mức đặt lại nội dung và cài đặt trên trình mô phỏng. Trong Xcode, tôi làm trống bộ nhớ cache và làm sạch tất cả các mục tiêu. Lỗi: 'NSInternalInconsistencyException', lý do: '+ entityForName: không thể định vị NSManagedObjectModel cho tên thực thể' Sách '' vẫn xảy ra. Cảm ơn sự giúp đỡ của bạn Tim. – CraigH
Bước qua chương trình trong trình gỡ lỗi - giá trị của 'managedObjectModel' khi bạn nhận được ngoại lệ là gì? 'managedObjectContext'? – Tim
Xin chào. Được rồi trong trình gỡ lỗi tôi không thấy managedObjectModel - nhưng những gì tôi thấy là giá trị cho managedObjectContext là null trong khung nhìn ViewViewViewView gốc - đó là sai, nó sẽ có một giá trị ở đó. Trong phiên bản chưa sửa đổi của ứng dụng, giá trị của managedObjectContext là 0x3e2ce60 trong viewDidLoad. và trình gỡ lỗi dừng trên dòng này: NSEntityDescription * entity = [NSEntityDescription entityForName: @ "Book" inManagedObjectContext: managedObjectContext]; Đó là bên trong - (NSFetchedResultsController *) fetchedResultsController phương pháp của RootViewController. – CraigH