如何将数据库从AppDelegate传递到ViewController
问题描述:
我不知道为什么这个代码错误。 请帮忙。 我阅读了一些文章,我认为这个问题是关于上下文的。 我该怎么办?如何将数据库从AppDelegate传递到ViewController
这个程序是关于显示coredata中的数据来标记在viewcontroller。
AppDelegate.h
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
@end
AppDelegate.m
#import "AppDelegate.h"
#import "Test.h"
#import "ViewController.h"
@interface AppDelegate()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
NSManagedObjectContext *context = [self managedObjectContext];
Test *t = [NSEntityDescription insertNewObjectForEntityForName:@"Test"
inManagedObjectContext:context];
t.name = @"please";
return YES;}
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (nonatomic,strong) NSArray *temp;
@property (nonatomic,strong) NSManagedObjectContext* managedObjectContext;
@end
ViewController.m
#import "ViewController.h"
#import "Test.h"
@interface ViewController()
@end
@implementation ViewController
@synthesize managedObjectContext;
@synthesize temp;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Test"
inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error;
self.temp = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
for(Test *info in temp){
_label.text = info.name;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
Test.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Test : NSManagedObject
@property (nonatomic, retain) NSString * name;
@end
Test.m
#import "Test.h"
@implementation Test
@dynamic name;
@end
我不知道为什么这段代码错误。 请帮忙。 我阅读了一些文章,我认为这个问题是关于上下文的。 我该怎么办?
答
在您的视图控制器,更换线路:
@synthesize managedObjectContext;
有了这个:
- (NSManagedObjectContext *) managedObjectContext {
return ((AppDelegate *)[[UIApplication sharedApplication] delegate]).managedObjectContext;
}
而不是存储在您的视图控制器中的另一个,不同对象上下文,此属性将返回对象上下文你在应用程序委托中设置。
还有其他方法可以做到这一点,例如按照Singleton模式创建一个Core Data帮助器类(如@ NewYork167所示),但这至少应该解决当前的问题。
答
任何未来的参考,你也可以尝试继承了的NSManagedObjectContext这样的:
@interface MyManagedObjectContext : NSManagedObjectContext
+ (MyManagedObjectContext *)mainThreadContext;
@end
@implementation MyManagedObjectContext
+ (MyManagedObjectContext *)mainThreadContext;
{
static MyManagedObjectContext *moc;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
moc = [[self alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
// Setup persistent store coordinator here
});
return moc;
}
@end
你能在发生错误详细点吗?另外,请尝试删除所有不必要的代码(例如:'didReceiveMemoryWarnimg'),因为它不会帮助我们快速完成任务。 – Romain 2015-03-02 19:29:25
它在NSEntityDescription *实体上的错误[NSEntityDescription entityForName:@“Test” inManagedObjectContext:managedObjectContext]; [fetchRequest setEntity:entity]; – Newbie 2015-03-02 19:34:40
我想因为ViewController不知道AppDelegate的上下文。 – Newbie 2015-03-02 19:35:52