刷新引用ManagedObjectContext

时间:2012-06-12 21:47:25

标签: iphone ios nsmanagedobjectcontext

在我的iOS应用程序中我有一个核心数据,我注意到有时,在特定视图中,当我从核心数据中检索信息时,并不总是最新的,我解释得很好:

如果我更新核心数据中的某个值,然后我进入特定视图查看此信息,该信息不是最新的,现在我将展示我如何访问我的数据库:

·H

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

的.m

@synthesize managedObjectContext;

- (NSArray *)sortInformation{

if (managedObjectContext == nil) {

    managedObjectContext = [(AppDelegate *) [[UIApplication sharedApplication] delegate] managedObjectContext];

}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"MyEntity" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

....

然后我在表格视图中显示我的信息,所有工作完美,只有这个问题,有些时候似乎我在另一个视图中完成的更新未在此视图中读取,但如果我关闭应用程序,我从背景关闭它,然后我重新打开它一切正常...所以我已正确保存核心数据更新,所以我认为问题是在这个视图中,也许我有一个旧的参考核心数据而不是更新版本,可能问题是:

if (managedObjectContext == nil) {

    managedObjectContext = [(AppDelegate *) [[UIApplication sharedApplication] delegate] managedObjectContext];

}

只有当变量managedObjectContext为nil才刷新,所以只有在视图被解除分配时...所以永远不要,因为我是UITabbarController中的一个根视图控制器,所以我的问题是,我如何访问核心数据总是有它的更新版本?

2 个答案:

答案 0 :(得分:1)

无需刷新上下文只需在[managedObjectContext save];这样的托管对象上调用save方法 或者如果您使用多个托管对象上下文,则应合并上下文所做的更改

答案 1 :(得分:0)

关于数据库类的实现,你可以这样做

-(id) initWithContext: (NSManagedObjectContext *)managedObjContext {
    self = [super init];
    [self setManagedObjectContext:managedObjContext];
    return self;    
}

managedObjContext传递并设置

在你的app委托调用数据库类时,它应该是这样的

database = [[Database alloc] initWithContext:self.managedObjectContext];

然后您可以像这样访问数据库

- (NSArray *)sortInformation {
           NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
           NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

           NSMutableArray *mutableFetchResults = [[[managedObjectContext_ executeFetchRequest:request error:&error] mutableCopy] autorelease];
           [request release];
           return mutableFetchResults;
}