CoreData将数据重新加载到UITableView问题

时间:2011-03-01 10:09:58

标签: core-data ios4 nsmanagedobjectcontext

我再次与CoreData战斗,我需要你的帮助:P

我正在写一个RSS阅读器。 设计基于使用libxml2库的Apple TopSongs示例。

当我的应用程序启动时,我正在检查最后一次更新的时间。如果超过1小时,我将删除当前的持久存储并再次下载所有内容。

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,以便在后台从Feed中下载信息。

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

与每个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]

我希望看到空表,但数据仍在那里。

这怎么可能?我删除了商店,重新获取并重新加载了数据。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

嘿,不要删除整个Core Data数据库...删除Core Data数据库中的每个条目,而不是整个库本身。您可以通过以下方式从Core Data数据库中删除对象:

[context deleteObject:aCoreDataObject];

哦还有一件事......如果您更改了Core Data数据库,那么这将不会反映在tableview中。如果您想查看需要调用的更改,例如[tableView reloadData];

答案 1 :(得分:1)

我认为您的问题可能出在

  

[self.managedObjectContext save:& err];

请遵循@ Ladislav的建议:

    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];