如何将数据库从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 

我不知道为什么这段代码错误。 请帮忙。 我阅读了一些文章,我认为这个问题是关于上下文的。 我该怎么办?

+0

你能在发生错误详细点吗?另外,请尝试删除所有不必要的代码(例如:'didReceiveMemoryWarnimg'),因为它不会帮助我们快速完成任务。 – Romain 2015-03-02 19:29:25

+0

它在NSEntityDescription *实体上的错误[NSEntityDescription entityForName:@“Test” inManagedObjectContext:managedObjectContext]; [fetchRequest setEntity:entity]; – Newbie 2015-03-02 19:34:40

+0

我想因为ViewController不知道AppDelegate的上下文。 – Newbie 2015-03-02 19:35:52

在您的视图控制器,更换线路:

@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 

参考:Best practices for passing NSManagedObjectContext around to UITabBarController child view controllers?