2013-10-22 139 views
2

我有一些对象是图像与对象用户mani对一个像这样的图像< < --->用户。现在我想做的事情,当用户登录我显示一个按钮,每一个图片添加到收藏夹,当我点击这个按钮,运行此代码:核心数据如何更新记录?

User * user = [[UserController sharedInstance] currentUser]; 
Image * image = (Image*)[user.managedObjectContext objectWithID:[self.yacht objectID]]; 
yacht.whoLiked = user 

问题不是我相同的控制器,但在之前,因为我所做的是加载图像的拇指集合视图(并在此控制器加载数据库中的所有数据),然后当我按下拇指我去另一个控制器,显示我的大图像和添加收藏夹的按钮,当我按下它,然后回到旧控制器的旧控制器的viewDidAppear我重新加载每次数据从数据库但我看不到任何变化,如果我改变部分(控制器),我回来看看我看到的数据更新

我这是怎么调用数据库从主控制器

- (void)fetchImages 
{ 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Image"]; 
    request.predicate = [NSPredicate predicateWithFormat:@"ANY whichCategories.name =[cd] %@", self.category.name]; 
    NSSortDescriptor *sortName = [[NSSortDescriptor alloc] initWithKey:@"headline" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; 

    request.sortDescriptors = [NSArray arrayWithObject:sortName]; 
    NSError * error = nil; 

    self.images = [self.database.managedObjectContext executeFetchRequest:request error:&error]; 
    [self.collectionView reloadData]; 


} 

- (void)useDocument 
{ 
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.database.fileURL path]]) { 
     // CREATE 
     [self.database saveToURL:self.database.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { 
      [self fetchImages]; 

     }]; 
    } else if (self.database.documentState == UIDocumentStateClosed) { 
     // OPEN 
     [self.database openWithCompletionHandler:^(BOOL success) { 
       [self fetchImages]; 
     }]; 
    } else if (self.database.documentState == UIDocumentStateNormal) { 
     // USE 
      [self fetchImages]; 


    } 
} 

- (void)setDatabase:(UIManagedDocument *)database 
{ 
    if (_database != database) { 
     _database = database; 
     [self useDocument]; 
    } 
} 

-(void)viewDidAppear:(BOOL)animated{ 

    [super viewDidAppear:animated]; 
    [self useDocument]; 
    //[self.collectionView reloadData]; 
    [UIView beginAnimations:@"" context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    self.collectionView.alpha = 1; 
    [UIView commitAnimations]; 
} 

为什么,如果我回来,并返回代码工作否则就像是我没有要求刷新阵列的服务器?

回答

1

Triy与此代码:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:[NSEntityDescription entityForName:@"Favorits" inManagedObjectContext:moc]]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", @"Some Title"]; 
[request setPredicate:predicate]; 

NSError *error = nil; 
NSArray *results = [moc executeFetchRequest:request error:&error]; 

YourObject *object = [results objectAtIndex:0]; 
object.title = @"Bla bla bla"; 

//save changes 
[moc save:&error]; 

if (error) { 
    //Do something 
} 

这2链接是有帮助的:

http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/NSFetchRequest.html

0

如果我没有误解你,问题是当你刷新阵列时,你的数据不会被更新。

如果您从数据库中重新加载并且您尚未保存更改,那么您将获得数值在数据库中。您应该这样做:

NSError *saveError = nil; 
[user.managedObjectContext save:&saveError]; 

if (error) { 
    //Do whatever 
} 

您应该在再次调用函数以从数据库重新加载数组之前使用此代码。这个位置取决于你,但是如果你在调用viewcontroller时只调用数据库刷新数组,你可以在离开viewController时保存数据。

+0

我不得不使用它,然后我的代码? –

+0

是的,您需要始终保存您的更改。您可以在每次更改后保存更改,但我不建议您这样做。我建议在离开视图控制器之前保存上下文。 – Alex

+1

让我们来看看我需要2分钟 –