0

我认为我在为 DO STUFF 创建代码方面并不差。但我在存储我的变量和持久数据方面很糟糕。我正在使用 ARC 和故事板(考虑放弃故事板,因为它们似乎在做一些我看不到的事情)。

我寻求帮助。到目前为止,我无法从我找到的来源中掌握如何做我想做的事情的概念。

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

我寻求帮助。

该应用程序不显示任何警告并且编译没有任何问题。

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

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

现在我认为问题在于视图控制器以某种方式无法访问托管对象上下文。但我认为 coredata 将被视为全局数据,可以从应用程序的任何部分访问,例如一盒乐高积木。

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

如果有人喜欢它,我很想举一个例子,说明在哪里放置哪个属性,在哪里放置哪个合成器和钩子,这样它才能真正起作用。

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

4

1 回答 1

0

根据您的问题,您应该检查两个不同的事情。

首先,您是否正确设置了核心数据堆栈?通常,就像 Apple 所做的那样,这可以在应用程序委托中进行设置。

那么,你是否正确地注入了上下文引用?这可以如下执行。

- (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");
于 2013-03-24T14:44:47.373 回答