2012-02-11 52 views
2

我试图做一些非常类似于正在做的事情here,但由于没有给出真正的答案,我想看看是否有人可以帮助我与我特别的问题。NSManagedObjectContext = [NSEntityDescription ...]后的SIGABRT

我只是试图添加核心数据到我有的现有应用程序。 下面是我已经添加到相应的文件。 我也概述了我的应用程序加载时我在哪里得到SIGABRT。 我已验证“loadData”中的上下文变量不为NULL。

AppDelegate.h

#import <UIKit/UIKit.h> 
#import <CoreData/CoreData.h> 
@interface AppDelegate : NSObject <UIApplicationDelegate> { 
} 

... 

@property (readonly, retain, nonatomic) NSManagedObjectContext *managedObjectContext; 
@property (readonly, retain, nonatomic) NSManagedObjectModel *managedObjectModel; 
@property (readonly, retain, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;  
-(void)loadData; 
@end 

AppDelegate.m

#import "NewModel.h" 

@synthesize managedObjectContext = __managedObjectContext; 
@synthesize managedObjectModel = __managedObjectModel; 
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator; 
... 

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

    __managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    __managedObjectModel = [[NSManagedObjectModel alloc] init]; 
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] init]; 
    [__managedObjectContext setPersistentStoreCoordinator:__persistentStoreCoordinator];   
    [self loadData]; 
} 

- (NSManagedObjectContext *)managedObjectContext { 
    if (__managedObjectContext) { 
     return __managedObjectContext; 
     } 

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


-(void)loadData 
{ 
    NSManagedObjectContext *context = [self managedObjectContext]; 

    NSManagedObjectModel *newObj; // Tried NewModel = *newObj; thinking that may resolve 
            //   the issue, didn't work though 
    newObj = [NSEntityDescription 
       insertNewObjectForEntityForName:@"NewModel" 
       inManagedObjectContext:context]; --> SIGABRT WHEN TRYING TO EXECUTE THIS 
    [newTeam setValue:@"value" forKey:@"modelValue"]; 
    NSError *error; 
    [context save:&error]; 
} 

NewModel.h

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

@interface NewModel : NSManagedObject  
@property (nonatomic, retain) NSString * modelvalue; 
@end 

NewModel.m

#import "NewModel.h" 

@implementation NewModel 
@dynamic modelValue; 
@end 

回答

0

哪一个,newmodel或teammodel?

@interface NewModel : NSManagedObject  
@implementation TeamModel 
+0

抱歉,这是在我的代码的新模式,在这个问题犯了一个错误,我会解决这个问题 – Vince613 2012-02-11 19:09:35

0

你写这个getter方法:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    return __persistentStoreCoordinator; 
} 

你把它在这一行,但我没有看到它的任何地方定义。

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
if (!coordinator) { 
    return nil; 
} 
+0

不,我没有,感谢您的渔获物,但它并没有解决我的问题。仍然命中相同SIGABRT – Vince613 2012-02-11 19:14:18

0

有您所创建的数据模型,启动应用程序,然后更改的数据模型,然后尝试再次启动应用程序?如果是这样,您的应用将崩溃,因为持久性存储与数据模型不兼容。您需要删除您的应用并重新安装,而不是安装在“顶部”。

另外...请把一个断点,并确保'上下文'不是零。我假设你有@synthesize managedObjectContext = __managedObjectContext; ??

+0

因此,当我尝试向我的NewModel实体中插入新的托管对象时,应用程序崩溃。它从来没有加载超过这一点。我试过删除应用程序并重新构建并运行它,但没有得到任何不同的结果。 而且我确认__managedObjectContext不是零。我有@synthesize代码并将其添加到上面。 – Vince613 2012-02-11 21:19:18

1

我上面的代码的问题是,我没有正确地正确初始化我的persistentStoreCoordinator或managedObjectModel。以下是一次添加的两个功能,让我知道这个问题。

/** 
    Returns the managed object model for the application. 
    If the model doesn't already exist, it is created by merging all of the models found in the application bundle. 
    */ 

- (NSManagedObjectModel *)managedObjectModel { 

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

    NSString *path = [[NSBundle mainBundle] pathForResource:@"LocalDatabase" ofType:@"momd"]; 
    NSURL *momURL = [NSURL fileURLWithPath:path]; 
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

    //managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];  
    return managedObjectModel; 
    } 


    /** 
    Returns the persistent store coordinator for the application. 
    If the coordinator doesn't already exist, it is created and the application's store added to it. 
    */ 
    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
    { 
     if (persistentStoreCoordinator != nil) { 
      return persistentStoreCoordinator; 
     } 

     NSString *storePath = [ [self applicationDocumentsDirectory] stringByAppendingPathComponent:@"LocalDatabase.db"]; 
     NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 

     // Put down default db if it doesn't already exist 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 
     if (![fileManager fileExistsAtPath:storePath]) { 
      NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"LocalDatabase" ofType:@"sqlite"]; 
      if (defaultStorePath) { 
       [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
      } 
     } 

     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; 
    } 
相关问题