2013-10-22 190 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分鐘 –