PersistenceCoreDataViewController.xib中的视图将不会显示

时间:2011-03-23 20:17:39

标签: iphone objective-c cocoa-touch xcode core-data

是的,我是新手,但我肯定会感谢一些帮助。我有一个相当简单的示例应用程序,我正在努力学习核心数据。我有一个应用程序,它只显示四个文本字段,并允许用户在这四个字段中保存文本。

该应用程序编译,但在执行时,我得到一个“黑色”屏幕。我最初认为我的问题是我的PersitenecCoreDataViewController.xib中的视图由于某种原因没有显示。但是,在我的调试器控制台中,由于未捕获的异常,我发现我的应用程序被终止的位置:

  

NSInvalidArgumentException',原因:   'executeFetchRequest:错误:获取   请求必须有实体

我现在认为我没有正确设置我的获取请求。

我的app署名和vi​​ewController类代码如下所示。提前感谢您的时间和帮助。 。

//  PersistenceCoreDataAppDelegate.h  
//  Created by RICHARD COLEMAN on 3/21/11.

#import <UIKit/UIKit.h>  
#import <CoreData/CoreData.h>  

@class PersistenceCoreDataViewController;

@interface PersistenceCoreDataAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow* window;
    PersistenceCoreDataViewController* rootController;

@private  
    NSManagedObjectContext* managedObjectContext_;  
    NSManagedObjectModel* managedObjectModel_;  
    NSPersistentStoreCoordinator* persistentStoreCoordinator_;  
}

@property (nonatomic, retain) IBOutlet UIWindow* window;  
@property (nonatomic, retain, readonly) NSManagedObjectContext* managedObjectContext;  
@property (nonatomic, retain, readonly) NSManagedObjectModel* managedObjectModel;  
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator* persistentStoreCoordinator;  
@property (nonatomic, retain) IBOutlet PersistenceCoreDataViewController* rootController;  

- (NSString *)applicationDocumentsDirectory;  

@end


//  PersistenceCoreDataAppDelegate.m  
//  Created by RICHARD COLEMAN on 3/21/11.  

#import "PersistenceCoreDataAppDelegate.h"  
#import "PersistenceCoreDataViewController.h"  


@implementation PersistenceCoreDataAppDelegate

@synthesize window;  
@synthesize rootController;  

#pragma mark -  
#pragma mark Application lifecycle  

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.
    [window addSubview:rootController.view];
    [window makeKeyAndVisible];

    return YES;
}


// applicationWillTerminate: saves changes in the application's managed object context // before the application terminates.  
- (void)applicationWillTerminate:(UIApplication *)application {

    NSError *error = nil;
    if (managedObjectContext_ != nil) {
        if ([managedObjectContext_ hasChanges] && ![managedObjectContext_ save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }
}


#pragma mark -  
#pragma mark Core Data stack  

- (NSManagedObjectContext *)managedObjectContext {

    if (managedObjectContext_ != nil) {
        return managedObjectContext_;
    }

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


- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel_ != nil) {
        return managedObjectModel_;
    }
    NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"PersistenceCoreData" ofType:@"momd"];
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
    managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return managedObjectModel_;
}


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }

    NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"PersistenceCoreData.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator_;
}


#pragma mark -  
#pragma mark Applications Documents directory  


- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}


#pragma mark -  
#pragma mark Memory management  

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
}


- (void)dealloc {

    [managedObjectContext_ release];
    [managedObjectModel_ release];
    [persistentStoreCoordinator_ release];

    [window release];
    [super dealloc];
}


@end



//  PersistenceCoreDataViewController.h  
//  Created by RICHARD COLEMAN on 3/21/11.  

#import <UIKit/UIKit.h>  

@interface PersistenceCoreDataViewController : UIViewController {

    UITextField* line1;  
    UITextField* line2;  
    UITextField* line3;  
    UITextField* line4;  
}

@property (nonatomic, retain) IBOutlet UITextField* line1;  
@property (nonatomic, retain) IBOutlet UITextField* line2;  
@property (nonatomic, retain) IBOutlet UITextField* line3;  
@property (nonatomic, retain) IBOutlet UITextField* line4;  

@end



//  PersistenceCoreDataViewController.m  
//  Created by RICHARD COLEMAN on 3/21/11.  

#import "PersistenceCoreDataViewController.h"  
#import "PersistenceCoreDataAppDelegate.h"  

@implementation PersistenceCoreDataViewController  

@synthesize line1;  
@synthesize line2;  
@synthesize line3;  
@synthesize line4;  

- (void)applicationWillTerminate:(NSNotification *)notification {

    // Get a reference to our application delegate, which we then use to get the managed object context, 
    // i.e. context, that was created for us
    // Remember an application delegate performs a specific action at a certain predefined time on behalf
    // of the application
    PersistenceCoreDataAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext* context = [appDelegate managedObjectContext];
    NSError* error;
    // Loop to execute 4x, ie. once for each line
    for (int i = 1; i <= 4; i++) {
        // Obtain field name by appending value of i to line
        NSString* fieldName = [NSString stringWithFormat:@" line%d", i];
        // Obtain reference to the correct field 
        UITextField* theField = [self valueForKey:fieldName];
        // Create fetch request; remember a fetch request is just a predefined query
        NSFetchRequest* request = [[NSFetchRequest alloc] init];
        // Create entity description (describing Line entity using correct context we retrieved
        // from application delegate) that will be fed to fetch request so it knows what type 
        // of entity to look for
        NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@" Line"
                                                             inManagedObjectContext:context];
        [request setEntity:entityDescription];
        // Create a predicate that identifies the right object for the field (this will help us
        // find out if there is already a managed object in the persistent store that corresponds 
        // to this field
        // managed object - instance of entity
        // persistent store - area where managed objects exist
        NSPredicate* pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i];
        [request setPredicate:pred];

        // Declared pointer and set to nil b/c we don't know yet if we're going to load a managed object
        // from the persistent store or create a new one
        NSManagedObject* theLine = nil;

        // Actually exec the fetch against the given context; rememeber the fetch request is just a query
        // and the context is where we manage the state, access, info about properties, etc.
        NSArray* objects = [context executeFetchRequest:request error:&error];

        // Checking to see if objects are nil; if nil there was an error; handle appropriately
        if (objects == nil) {
            NSLog(@" There was an error!");
            // Do whatever error handling is appropriate
        }

        // Was an object returned that matched our criteria; if there is one, load it; if not create one
        if ([objects count] > 0)
            theLine = [objects objectAtIndex:0];
        else
            theLine = [NSEntityDescription insertNewObjectForEntityForName:@" Line"
                                                    inManagedObjectContext:context];

        // use key-value coding to set the line number and text for this managed object
        [theLine setValue:[NSNumber numberWithInt:i] forKey:@" lineNum"];
        [theLine setValue:theField.text forKey:@" lineText"];

        [request release];
    }
    // looping is complete, save changes
    [context save:&error];
}

// this method needs to determine if there is any existing data and if so, load it  
- (void)viewDidLoad {

    // get a reference to the application delegate and use it to get a pointer to the application's 
    // default context
    PersistenceCoreDataAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext* context = [appDelegate managedObjectContext];

    // Create an Entity Description that describes our entity
    NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@" Line"
                                                         inManagedObjectContext:context];
    // Create a fetch request, i.e. a query, and pass it the entity description so it knows what type
    // of objects to retriev
    NSFetchRequest* request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    // We don't create a predicate as we want to retrieve all Line objects in the persistent store
    NSError* error;
    NSArray* objects = [context executeFetchRequest:request error:&error];
    // Ensure we get back a valid array
    if (objects == nil) {
        NSLog(@" There was an error!");
        // Do whatever error handling is appropriate
    }

    // Using fast enumeration to loop thru array of retrieved managed objects pulling out the lineNum
    // and lineText and updating one of the text fields on our user interface
    for (NSManagedObject* oneObject in objects) {
        NSNumber* lineNum = [oneObject valueForKey:@" lineNum"];
        NSString* lineText = [oneObject valueForKey:@" lineText"];

        NSString* fieldName = [NSString stringWithFormat:@" line%@", lineNum];
        UITextField* theField = [self valueForKey:fieldName];
        theField.text = lineText;
    }

    [request release];

    // Register to be notified when the app is about to terminate so you can save any changes the user
    // has made to the data
    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationWillTerminate:)
                                                 name:UIApplicationWillTerminateNotification
                                               object:app];
    [super viewDidLoad];
}


// Override to allow orientations other than the default portrait orientation.
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {

    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.line1 = nil;
    self.line2 = nil;
    self.line3 = nil;
    self.line4 = nil;
    [super viewDidUnload];
}


- (void)dealloc {  
    [line1 release];  
    [line2 release];  
    [line3 release];  
    [line4 release];  
    [super dealloc];  
}


@end  

1 个答案:

答案 0 :(得分:0)

@ Julien和fluchtpunkt ..我也很新,我想知道是否有空间会导致问题?

我可能错了但看到你的错误消息“获取请求必须有一个实体”让我想知道你是否确实使用核心数据创建了实体和相关属性?这是我想到的第一件事。让我知道..