2009-10-27 11 views
35

का पता नहीं लगा सका मैं कोर डेटा के लिए सीखने की सहायता के रूप में ऐप्पल के CoreDataBooks नमूना प्रोजेक्ट का उपयोग कर रहा हूं।कोर-डेटा आईफोन: NSManagedObjectModel

मैंने ऐप को संशोधित किया ताकि जब ऐप लोड हो जाए तो मैं पहले मेनू पेज दिखाता हूं - पुस्तकें टेबलव्यू (रूटव्यू कंट्रोलर) नहीं।

मैंने किया है निम्नलिखित:

मैं इंटरफ़ेस बिल्डर (बस उस पर एक बटन के साथ एक दृश्य)

CoreDataBooksAppDelegate.h अब इस तरह दिखता में एक मेनू पृष्ठ बनाया:

// 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 

CoreDataBooksAppDelegate.m इस तरह दिखता है:

#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]; 
} 

शेष CoreDataAppDelegete.m अपरिवर्तित बनी हुई है।

MenuViewController में बटन क्लिक होने, निम्नलिखित कार्रवाई होती है:

RootViewController *modalViewController1 = [[[RootViewController alloc] initWithNibName:nil bundle:nil] autorelease]; 
[self presentModalViewController:modalViewController1 animated:YES]; 

आईबी में मैं MenuViewController बजाय RootViewController कॉल करने के लिए MainWindow.xib बदल दिया है।

तो, ऐप लोड और मेनू बटन के साथ ठीक से प्रदर्शित होता है। बटन क्लिक करने पर एप्लिकेशन रूटव्यू कंट्रोलर के दृश्यडिडलोड के अंदर क्रैश हो जाता है।

यह यहीं दुर्घटनाओं:

- (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"); 
} 

सांत्वना मैं इन्हें प्राप्त में:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Book'' 

मैं इस अपवाद के बारे में पढ़ा है लेकिन मैं इसे हल करने के लिए उचित कदम नहीं जानता।

उत्तर

87

ठीक है।

if (managedObjectContext == nil) 
{ 
    managedObjectContext = [(CoreDataBooksAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSLog(@"After managedObjectContext: %@", managedObjectContext); 
} 

मैं इतने पर यहाँ एक ऐसी ही समस्या के साथ किसी पाया: link text

रूप Aryeh उस पोस्ट में ने कहा: "में

RootViewController के viewDidLoad के अंदर निम्नलिखित कोड लगाकर त्रुटि समाप्त संक्षेप में आप किसी ऑब्जेक्ट कॉन्टेक्स्ट से किसी इकाई को लाने की कोशिश कर रहे हैं जिसे अभी तक सेट नहीं किया गया था। इसलिए आपके विकल्प इस समय लोड होने से पहले इसे सेट अप करने या ऐप में कहीं और करने के लिए हैं। "

3

क्या आपने कोर डेटा मॉडल बिल्कुल बदल दिया था? यह त्रुटि आम है जब ऐप के लिए कोर डेटा मॉडल अंतर्निहित SQLite डेटाबेस को भी बदले बिना बदलता है, इसलिए संग्रहीत डेटा और मॉडल सिंक से बाहर हैं।

सिम्युलेटर या परीक्षण डिवाइस से पूरी तरह से अपने ऐप को हटाने का प्रयास करें, फिर इसे पुन: इंस्टॉल करें और पुनः प्रयास करें।

+0

हाय। मैं सिम्युलेटर पर सामग्री और सेटिंग्स को रीसेट करने के लिए अब तक चला गया। एक्सकोड में मैंने कैश खाली कर दिया और सभी लक्ष्यों को साफ किया। त्रुटि: 'एनएसआईएननल इन्कॉन्सिस्टेंसी एक्सेप्शन', कारण: '+ entityForName: इकाई नाम' बुक '' के लिए एनएसएमएनेज्ड ऑब्जेक्ट मॉडल का पता नहीं लगा सका। आपकी मदद टिम के लिए धन्यवाद। – CraigH

+1

डीबगर में प्रोग्राम के माध्यम से कदम - अपवाद मिलने पर 'प्रबंधित ऑब्जेक्ट मॉडल' का मूल्य क्या है? 'ManagedObjectContext'? – Tim

+0

हाय। ठीक है डीबगर में मुझे प्रबंधित ऑब्जेक्ट मॉडल नहीं दिख रहा है - लेकिन मैं जो देखता हूं वह यह है कि प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट के लिए मूल्य रूटव्यू कंट्रोलर व्यूडिडलोड में शून्य है - जो गलत है, उसके पास एक मान होना चाहिए। ऐप के अनमोडिफाइड संस्करण में ManageDidLoad में प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट का मान 0x3e2ce60 है। और डीबगर इस लाइन पर रुक जाता है: एनएसईएनटीटी डिस्क्रिप्शन * इकाई = [एनएसईएनटीटी डिस्क्रिप्शन इकाईफोरनाम: @ "बुक" में प्रबंधित किया गया ऑब्जेक्ट कॉन्टेक्स्ट: प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट]; जो अंदर है - (NSFetchedResultsController *) रूटव्यू कंट्रोलर के रीडल्ट कंट्रोलर विधि। – CraigH

4

applicationDidFinishLaunching में: आप निम्न कार्य कर रहे हैं:

rootViewController.managedObjectContext = self.managedObjectContext; 

लेकिन मैं जहाँ कोड self.managedObjectContext सेटअप है नहीं दिख रहा। applicationDidFinishLaunching को बहुत जल्दी कहा जाता है। क्या आप वाकई प्रबंधित ऑब्जेक्ट संदर्भ सेट अप करते हैं?

+0

हाय डॉग का उपयोग करने की आवश्यकता हो सकती है। हां, प्रबंधित ऑब्जेक्ट संदर्भ सेटअप है (यह ऐप्पल से कोरडाटाबुक नमूना है, मैं बस एक मेनू जोड़ रहा था इसलिए मैंने बाकी कोड को छूटा)। यदि मैं लाइन को प्रतिस्थापित करता हूं तो एप्लिकेशनडिडफिशिश लॉन्चिंग में: [विंडो addSubview: viewController.view]; लाइन के साथ: [विंडो addSubview: [नेविगेशन नियंत्रक देखें]]; (मेरे प्रश्न पोस्टिंग में ऊपर देखें) तो ऐप रूटव्यू कंट्रोलर को तुरंत लोड करता है, ठीक चलता है और प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट शून्य नहीं है। किसी भी तरह से, एप्लिकेशनडिडफिनिश लॉन्चिंग में, प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट का मान है: । धन्यवाद। – CraigH

0

मेरे विकास के दौरान, मुझे उन संस्थाओं को नहीं मिला जिन्हें मैंने बाद में जोड़ा था। मेरे लिए क्या काम किया: (मूल रूप से एक सैनिटी-टिप :-)

ऐप को अनइंस्टॉल करें हर बार जब आप डेटा मॉडल बदलते हैं!

डेटा मॉडल को इंस्टॉल के बीच कोर डेटा द्वारा कैश किया जाता है, यह सुनिश्चित करने के लिए कि अखंडता व्यवहार में रहती है। अपने परिवर्तनों का परीक्षण करने में सक्षम होने के लिए सिम्युलेटर/आईफोन से ऐप हटाएं।

पीएस: क्या किसी को पता है कि यह स्वचालित रूप से कैसे करें?