2013-07-25 78 views
1

我有一個非常奇怪的問題,讓我很難過!核心數據沒有更新,更新的模型

我有,我剛剛加入了一些新的屬性到核心數據實體:

刪除 - 布爾 deletedDate - 日期

我有下面的代碼,即在按下上套這兩個值核心數據對象:

- (IBAction)deleteButtonInTable:(id)sender { 


    //Get the ID of the currently selected item in the table 
    NSInteger selected = [self.tweetTableView rowForView:sender]; 

    //Create a predicate and fetch the objects from Core Data 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"approved == NO"]; 
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"postDate" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil]; 
    [request setPredicate:testForTrue]; 
    [request setSortDescriptors:sortDescriptors]; 

    [request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]]; 

    //Setup the Request 
    [request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]]; 

    //Assign the predicate to the fetch request 
    NSError *error = nil; 

    //Create an array from the returned objects 
    NSArray *fetchedObjects = [_managedObjectContext executeFetchRequest:request error:&error]; 

    Tweet *selectedTweet = [fetchedObjects objectAtIndex:selected]; 

    if (selectedTweet) { 
     selectedTweet.deleted = [NSNumber numberWithBool:TRUE]; 
     selectedTweet.deletedDate = [NSDate date]; 
     NSLog(@"%@",selectedTweet); 
     [self refreshTableView]; 
     if (! self.tweetTableView){ 
      NSLog(@"Tableview doesn't exist!!)"); 
     } 
     [[self tweetTableView] reloadData]; 
     [[self managedObjectContext] commitEditing]; 
     [self saveAction:nil]; 
    } 

    if ([self.autoWriteTweets isEqualToString:@"YES"]){ 
     [self writeTweetsToXML]; 
     [self saveAction:nil]; 
    } 
} 

現在,如果我看在與一些場所xcode中該目的,我可以看到,因爲我通過該函數的對象的屬性改變,但我有一個表中顯示的數據源,這是f過濾只顯示刪除布爾設置爲true的對象,並沒有任何顯示在那裏。

現在,爲了讓事情更混亂我有出口的對象的數組功能:

-(void)writeTweetsToXML{ 
    //Create new fetch request 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

    //Set new predicate to only fetch tweets that have been favourited 
    NSPredicate *filterFavourite = [NSPredicate predicateWithFormat:@"approved == YES"]; 
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:self.exportSort ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil]; 
    [request setSortDescriptors:sortDescriptors]; 

    //Setup the Request 
    [request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]]; 
    [request setResultType:NSDictionaryResultType]; 

    //Assign the predicate to the fetch request 
    [request setPredicate:filterFavourite]; 
    NSError *error = nil; 

    //Create an array from the returned objects 
    NSArray *tweetsToExport = [_managedObjectContext executeFetchRequest:request error:&error]; 
    NSAssert2(tweetsToExport != nil && error == nil, @"Error fetching events: %@\n%@", [error localizedDescription], [error userInfo]); 


    //NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    //NSString *path = [NSString stringWithFormat:@"%@/tweets.xml", documents]; 
NSString *writeerror; 

    if(tweetsToExport) { 
     NSString * exportLocationFull = [[NSString alloc]initWithFormat:@"%@/tweets.xml",self.exportLocation]; 
     BOOL success = [tweetsToExport writeToFile:exportLocationFull atomically:YES]; 
     NSLog(@"Write Status = %d to %@", success, exportLocationFull); 
    } 
    else { 
     NSLog(@"%@",writeerror); 

    } 


} 

現在,當我看到導出的文件,兩件事情發生這是奇怪!

首先,我所看到的有它的刪除值設置爲true的對象,與價值出口爲0

其次,deletedDate屬性不出口可言,每一個,儘管它的核心是數據模型。我無法看到這種情況發生,因爲我沒有對導出進行特定的過濾。

這就像一個getter/setter的地方是壞的,但我已經檢查了類文件,一切都是因爲它應該是,並設置爲@dynamic。

任何幫助將不勝感激,因爲我有點失落至於到底是怎麼回事。

人們已經警告過我關於核心數據的怪癖,但這簡直太古怪了!

乾杯

加雷

注1

順便說一句,我使用從所述第一部分中的確切相同的代碼來設置該過濾並似乎對象的其他屬性工作正常!

+0

比較http://stackoverflow.com/questions/16000242/core-data-nspredicate-predicatewithblock-and-predicatewithformat-in-parent-child - 你不應該調用屬性「刪除」。 –

+0

嗨馬丁,這就是它,DOH !!!!!你可以發佈它作爲答案,我會選擇它。不能相信我花了多長時間! –

回答

0

檢查事項:

  1. 你(例如顯示新的表視圖數據前)在適當的地方保存[managedObjectContext save:&error]核心數據實體?你檢查了錯誤變量嗎?

  2. 您是否使用新型號版本正確地遷移模型?

  3. 您是否正在閱讀正確的屬性並正確顯示它們(在UI或日誌語句中)?

順便說一句,在你的代碼中你要設置請求實體兩次。

0

嘗試在加載表視圖之前保存管理對象上下文。

刪除的布爾值可能在0之前且不會被更改,或者它可能會被自動初始化(檢查器中有一個字段用於設置默認值)爲0.另一方面,日期字段默認爲零。

P.S.在Objective-C中使用[NSNumber numberWithBoolean:YES]

+0

你也可以使用這個:'@ YES' – Mundi

+0

@Mundi:絕對的,至少如果他使用的是最新版本的SDK。 – Paul