首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSManagedObjectContext = [NSEntityDescription ...]之后的SIGABRT

NSManagedObjectContext = [NSEntityDescription ...]之后的SIGABRT
EN

Stack Overflow用户
提问于 2012-02-11 18:05:13
回答 4查看 1.8K关注 0票数 2

我正在尝试做一些与here正在做的事情非常相似的事情,但由于没有给出真正的答案,我想看看是否有人可以帮助我解决我的特定问题。

我只是想将核心数据添加到我现有的应用程序中。下面是我添加到各个文件中的内容。我还概述了当我的应用程序加载时,我在哪里获得SIGABRT。我已经验证了"loadData“中的上下文变量不是空的。

AppDelegate.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

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

NewModel.m

代码语言:javascript
复制
#import "NewModel.h"

@implementation NewModel
@dynamic modelValue;
@end
EN

回答 4

Stack Overflow用户

发布于 2012-02-13 08:12:18

上面代码的问题是我没有正确地初始化我的persistentStoreCoordinator或managedObjectModel。下面是两个函数,一旦添加,我就解决了这个问题。

代码语言:javascript
复制
    /**
     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;
    }
票数 1
EN

Stack Overflow用户

发布于 2012-02-11 19:18:03

哪一个,新模型还是团队模型?

代码语言:javascript
复制
 @interface NewModel : NSManagedObject    
 @implementation TeamModel
票数 0
EN

Stack Overflow用户

发布于 2012-02-11 19:19:23

你是否编写了这个getter方法:

代码语言:javascript
复制
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    return __persistentStoreCoordinator;
}

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

代码语言:javascript
复制
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
    return nil;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9239349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档