我再次与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]
我希望看到空表,但数据仍在那里。
这怎么可能?我删除了商店,重新获取并重新加载了数据。
我做错了什么?
答案 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];