了解在Core Data中使用NSManagedObjectContext

时间:2013-03-24 10:29:03

标签: core-data nsmanagedobjectcontext

我认为我可以为DO STUFF创建代码。但我在存储我的变量和持久数据时非常糟糕。我正在使用ARC和故事板(考虑放弃故事板,因为它们似乎在引擎盖下做了我看不到的东西)。

我请求帮助。我无法理解如何从我现在发现的来源做我想要的事情。

我的想法是: 向用户显示tableviewcontroller类型的viewController,向其显示每行的字符串(股票报价名称)。字符串需要永久存储我在coredata中设定。该应用程序允许用户在secondviewcontroller中添加字符串。这些也需要在第一个数据中持久保存。然后,应用程序需要获取一些基于Web的数据并将其与字符串(股票价格)一起显示。当应用程序退出时,它可以删除基于Web的数据并保留字符串(股票报价名称)。

我要求帮助。

该应用程序没有任何警告和编译没有任何问题。

然后它在 NSLog(@“2”); 之后在下面的代码viewDidLoad中崩溃, *因未捕获的异常而终止应用'NSInvalidArgumentException',原因:'+ entityForName:nil不是合法的NSManagedObjectContext参数,用于搜索实体名称'Stock''

Appdelegate.h
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

Appdelegate.m
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (void)prvniSpusteni
{
    NSLog(@"Firt run of app, example Stocks added.");
    NSManagedObjectContext *context = [self managedObjectContext];

    // Creating, Apple, Google, Bekrshire B

    Stock *akcie1 = [NSEntityDescription insertNewObjectForEntityForName:@"Stock" inManagedObjectContext:context];
    akcie1.ticker = @"AAPL";
    akcie1.index = [NSNumber numberWithInt:0];
    Stock *akcie2 = [NSEntityDescription insertNewObjectForEntityForName:@"Stock" inManagedObjectContext:context];
    akcie2.ticker = @"HIMX";
    akcie2.index = [NSNumber numberWithInt:1];
    Stock *akcie3 = [NSEntityDescription insertNewObjectForEntityForName:@"Stock" inManagedObjectContext:context];
    akcie3.ticker = @"BRK-B";
    akcie3.index = [NSNumber numberWithInt:2];

    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Error: %@", [error localizedDescription]);
    }
    [self aktualizaceDatTrhu]; // method to get data from web declared in Appdelegate aswell.
}

ViewController.h
@property (nonatomic, strong) NSManagedObjectContext* managedObjectContext;
@property (nonatomic, strong) NSArray *ulozeneAkcie;

ViewController.m
@interface ViewController ()
@end

@implementation ViewController
@synthesize managedObjectContext;
@synthesize ulozeneAkcie;

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSManagedObjectContext *context = managedObjectContext;
    **NSLog(@"2");**
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Stock" inManagedObjectContext:context];
    NSLog(@"3");
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSLog(@"4");
    [request setEntity:entityDescription];
    NSLog(@"5");
    // Nastav trideni do arraye
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                        initWithKey:@"index" ascending:YES];
    [request setSortDescriptors:@[sortDescriptor]];
    NSLog(@"6");
    NSError *error;
    ulozeneAkcie = [managedObjectContext executeFetchRequest:request error:&error];
    NSLog(@"7");
    }

现在我认为问题是viewcontroller以某种方式无法访问managedobjectcontext。但我认为coredata将被视为全球性的,可以从应用程序的任何部分访问,就像一盒乐高积木。

最深切的感谢任何读到这里的人,甚至更深的感谢任何提供见解的人。

如果有人觉得这样,我会很乐意得到一个例子,说明在哪里放置哪个属性,在哪里合成和挂钩以便这实际上可以工作。

PS:我在网上发现了一些“类似”的问题,并且谈到将MOC传递给viewController,但由于我的应用程序是用故事板制作的,我想念很多钩子和插座并添加它们并没有解决任何问题..

1 个答案:

答案 0 :(得分:0)

根据您的问题,您应该检查两件事。

首先,您是否正确设置了核心数据堆栈?通常,正如Apple所做的那样,这可以在app delegate中设置。

然后,您是否正确注入了上下文引用?这可以像下面这样执行。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"segueIdentifier"])
    {
        ViewController *vc = [segue destinationViewController];
        vc.managedObjectContext = mainContext; // pass here the context that you created in app delegate or you grabbed from another property, for example
    }
}

现在,在viewDidLoad

[super viewDidLoad];

if(!self.managedObjectContext) // see if context is nil
    NSAssert(NO, @"The context cannot be nil"); // just for test purposes

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Stock" inManagedObjectContext:context];
NSLog(@"3");
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSLog(@"4");
[request setEntity:entityDescription];
NSLog(@"5");
// Nastav trideni do arraye
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:@"index" ascending:YES];
[request setSortDescriptors:@[sortDescriptor]];
NSLog(@"6");
NSError *error;
ulozeneAkcie = [managedObjectContext executeFetchRequest:request error:&error];
NSLog(@"7");