0

我又和 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 从后台的提要中下载信息。

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

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

我希望看到空表,但数据仍然存在。

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

我究竟做错了什么?

4

2 回答 2

1

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

[context deleteObject:aCoreDataObject];

哦还有一件事......如果你改变你的核心数据数据库,那将不会反映在 tableview 中。例如,如果您想查看更改,则需要致电[tableView reloadData];

于 2011-03-01T10:15:02.323 回答
1

我认为您的问题可能与线路有关

[self.managedObjectContext 保存:&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];
于 2011-03-01T10:23:34.567 回答