2011-03-01 60 views
0

我與CoreData再次戰鬥,我需要你的幫助:PCoreData重載數據到UITableView的問題

我寫一個RSS閱讀器。 設計基於使用libxml2庫的Apple TopSongs示例。

當我的應用程序啓動時,我正在檢查什麼時候是最後一次更新。如果超過1小時前刪除當前的Persistent商店並再次下載所有內容。

if ([[NSFileManager defaultManager] fileExistsAtPath:self.persistentStorePath]) { 
     NSError *error = nil; 
     BOOL oldStoreRemovalSuccess = [[NSFileManager defaultManager] removeItemAtPath:self.persistentStorePath error:&error]; 
     NSAssert3(oldStoreRemovalSuccess, @"Unhandled error adding persistent store in %s at line %d: %@", __FUNCTION__, __LINE__, [error localizedDescription]); 
    } 

我可以看到本地的sql文件被刪除了。

現在我正在創建一些NSOperations,從後臺下載源中的信息。

到目前爲止,一切都很好。

和每個RSS源一樣,有一個更新按鈕,它會檢查更改並更新coreData。 對於初學者我決定我將刪除一切,並重新下載一切(不知道我知道,但RSS飼料沒有GUID,我需要實現一個哈希函數來判斷是否有任何變化)。

所以我在做什麼,基本上調用與上述相同的代碼刪除商店... 重新下載所有的RSS源再次(在第一次被加載的應用程序相同的邏輯)

我重裝了表,但我仍然可以在tableView上看到相同的數據,一切都保持不變。

我決定走得更遠,並且在不下載內容的情況下刪除商店。

if ([[NSFileManager defaultManager] fileExistsAtPath:app.persistentStorePath]) { 
    NSError *error = nil; 
    BOOL oldStoreRemovalSuccess = [[NSFileManager defaultManager] removeItemAtPath:app.persistentStorePath error:&error]; 
    NSAssert3(oldStoreRemovalSuccess, @"Unhandled error adding persistent store in %s at line %d: %@", __FUNCTION__, __LINE__, [error localizedDescription]); 
} 

    [self.managedObjectContext save:&err]; 
    [self.fetchedResultsController performFetch:&error]; 
    [self.tableView reloadData] 

我期望看到空表,但數據仍然存在。

這怎麼可能?我刪除了商店,重新提取並重新加載數據。

我在做什麼錯了?

回答

1

嘿,不要刪除整個核心數據數據庫...刪除核心數據數據庫中的每個條目,而不是整個基地本身。您可以通過刪除從核心數據數據庫中的對象:

[context deleteObject:aCoreDataObject]; 

哦,還有一件事......如果你改變你的核心數據的數據庫,不會在tableview中得到體現。如果你想看到你需要調用例如[tableView reloadData];

+0

難道reloadData對你的工作? – Ladislav 2011-03-01 10:39:48

+1

有一個完美的答案。 刪除持續單位,頻繁是一種不好的做法。只需從現有的持久性單元中刪除數據並添加最新的數據即可。 – 2011-03-01 11:31:38

+0

我從Apple示例中學習,他們在TopSongs示例中編寫了「 //刪除舊商店;比首先刪除每個對象 //首先測試現有商店」更容易。 – djTeller 2011-03-01 11:38:06

1

我認爲你的問題可能與線路變化

[self.managedObjectContext節省:& ERR]。

而是關注@拉吉斯拉夫的建議:

NSFetchRequest * allObjectsRequest = [[NSFetchRequest alloc] init]; 
    [allObjectsRequest setEntity:[NSEntityDescription entityForName:@"Object" inManagedObjectContext:context]]; 
    [allObjectsRequest setIncludesPropertyValues:NO]; //only fetch the managedObjectID 

    NSError * error = nil; 
    NSArray * objects = [context executeFetchRequest:allObjectsRequest error:&error]; 
    [allObjectsRequest release]; 
    //error handling goes here 
    for (NSManagedObject * object in objects) { 
     [context deleteObject:object]; 
    } 
    [context save:&error];