【发布时间】:2011-03-17 00:23:56
【问题描述】:
如何删除所有对象?我知道我可以删除一个
[managedObjectContext deleteObject:objToDelete];
是否可以在不迭代所有数组的情况下全部删除? 谢谢
【问题讨论】:
标签: objective-c iphone core-data
如何删除所有对象?我知道我可以删除一个
[managedObjectContext deleteObject:objToDelete];
是否可以在不迭代所有数组的情况下全部删除? 谢谢
【问题讨论】:
标签: objective-c iphone core-data
只需迭代数组并删除它们。没有明确的方法可以将它们全部删除。
【讨论】:
您也可以只拆除堆栈(释放NSManagedObjectContext、NSPersistentStore 和NSManagedObjectModel)并删除文件。可能比遍历整个数据库并单独删除每个对象要快。
此外,他们将来不太可能提供此功能,因为删除文件很容易。但是,如果您认为这很重要,请提交雷达并让 Apple 知道。否则他们不会知道有多少人想要这个功能。
【讨论】:
将对象标记为删除然后保存的工作方式是这样的,因为 Core Data 仍然需要为所有被删除的对象运行验证规则。毕竟,对象可以根据它对-validateForDelete: 的响应方式拒绝删除。
如果:
然后:
【讨论】:
这就是我“重置”我的数据存储的方法:
- (BOOL)resetDatastore
{
[[self managedObjectContext] lock];
[[self managedObjectContext] reset];
NSPersistentStore *store = [[[self persistentStoreCoordinator] persistentStores] lastObject];
BOOL resetOk = NO;
if (store)
{
NSURL *storeUrl = store.URL;
NSError *error;
if ([[self persistentStoreCoordinator] removePersistentStore:store error:&error])
{
[[self persistentStoreCoordinator] release];
__persistentStoreCoordinator = nil;
[[self managedObjectContext] release];
__managedObjectContext = nil;
if (![[NSFileManager defaultManager] removeItemAtPath:storeUrl.path error:&error])
{
NSLog(@"\nresetDatastore. Error removing file of persistent store: %@",
[error localizedDescription]);
resetOk = NO;
}
else
{
//now recreate persistent store
[self persistentStoreCoordinator];
[[self managedObjectContext] unlock];
resetOk = YES;
}
}
else
{
NSLog(@"\nresetDatastore. Error removing persistent store: %@",
[error localizedDescription]);
resetOk = NO;
}
return resetOk;
}
else
{
NSLog(@"\nresetDatastore. Could not find the persistent store");
return resetOk;
}
}
【讨论】:
-performBlockAndWait:的修改版本
此函数从磁盘中删除当前的 SQLite db 文件并创建一个新文件。它比任何迭代删除都要快。
-(void)deleteAndRecreateStore{
NSPersistentStore * store = [[self.persistentStoreCoordinator persistentStores] lastObject];
NSError * error;
[self.persistentStoreCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtURL:[store URL] error:&error];
__managedObjectContext = nil;
__persistentStoreCoordinator = nil;
[self managedObjectContext];//Rebuild The CoreData Stack
}
如果您想在 Application Delegate 外部调用它(假设样板 CoreData 集成),您可以使用 this 获取对您的应用委托的引用:
YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
不要忘记导入标头。
【讨论】:
当您删除所有缓存和文档时,您正在删除数据库。不是对 managedObjectContext 的必要调用
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSArray *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSMutableArray *paths = [NSMutableArray array];
[paths addObjectsFromArray:documents];
[paths addObjectsFromArray:caches];
for (NSUInteger i = 0; i < [paths count]; i++) {
NSString *folderPath = [paths objectAtIndex:i];
NSLog(@"Attempting to remove contents for: %@", folderPath);
//Remove all cached data in the local app directory
NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:&error];
for (NSString *strName in dirContents) {
[[NSFileManager defaultManager] removeItemAtPath:[folderPath stringByAppendingPathComponent:strName] error:&error];
if (error != nil) {
NSLog(@"Error removing item: %@ : %@", strName, error.description);
} else {
NSLog(@"Removed item: %@", strName);
}
}
}
【讨论】:
我使用了 stifin 的代码并将其更新为使用 -performBlockAndWait:
- (BOOL)reset
{
__block BOOL result = YES;
[[self mainContext] performBlockAndWait:^{
[[self mainContext] reset];
NSArray* stores = [[self persistentStoreCoordinator] persistentStores];
_mainContext = nil;
_persistedContext = nil;
for(NSPersistentStore* store in stores) {
NSError* error;
if(![[self persistentStoreCoordinator] removePersistentStore:store error:&error]) {
debuglog(@"Error removing persistent store: %@", [error localizedDescription]);
result = NO;
}
else {
if(![[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:&error]) {
debuglog(@"Error removing file of persistent store: %@", [error localizedDescription]);
result = NO;
}
}
}
_persistentStoreCoordinator = nil;
}];
return result;
}
【讨论】: