我认为我可以为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,但由于我的应用程序是用故事板制作的,我想念很多钩子和插座并添加它们并没有解决任何问题..答案 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");