Objective c 如何从核心数据中删除所有对象
如何删除所有对象?我知道我可以一个接一个地移除Objective c 如何从核心数据中删除所有对象,objective-c,iphone,core-data,Objective C,Iphone,Core Data,如何删除所有对象?我知道我可以一个接一个地移除 [managedObjectContext deleteObject:objToDelete]; 是否可以在不迭代所有数组的情况下删除所有? 谢谢只需迭代数组并删除它们。没有一个定义的方法可以将它们全部删除。您也可以拆下堆栈(释放NSManagedObjectContext、NSPersistentStore和NSManagedObjectModel)并删除该文件。可能比遍历整个数据库并逐个删除每个对象要快 此外,他们不太可能在将来提供此功能,因
[managedObjectContext deleteObject:objToDelete];
是否可以在不迭代所有数组的情况下删除所有?
谢谢只需迭代数组并删除它们。没有一个定义的方法可以将它们全部删除。您也可以拆下堆栈(释放
NSManagedObjectContext
、NSPersistentStore
和NSManagedObjectModel
)并删除该文件。可能比遍历整个数据库并逐个删除每个对象要快
此外,他们不太可能在将来提供此功能,因为删除文件很容易。不过,如果你觉得这很重要,那么就提交一份雷达文件,让苹果知道。否则,他们将不知道有多少人需要此功能。标记要删除的对象,然后保存,因为核心数据仍然需要为所有要删除的对象运行验证规则。毕竟,对象可以根据其对
-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;
}
}
此函数用于从磁盘中删除当前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
}
如果要调用此外部应用程序委托(假设样板文件CoreData集成),可以使用获取对应用程序委托的引用:
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);
}
}
}
NSArray*documents=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSArray*caches=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,是);
NSMutableArray*路径=[NSMutableArray];
[路径addObjectsFromArray:文档];
[路径addObjectsFromArray:缓存];
对于(整数i=0;i<[路径计数];i++){
NSString*folderPath=[path objectAtIndex:i];
NSLog(@“正在尝试删除%@”的内容,folderPath);
//删除本地应用程序目录中的所有缓存数据
NSArray*dirContents=[[NSFileManager defaultManager]目录目录路径:folderPath错误:&error];
for(目录中的NSString*strName){
[[NSFileManager defaultManager]removeItemAtPath:[folderPath stringByAppendingPathComponent:strName]错误:&error];
如果(错误!=nil){
NSLog(@“删除项时出错:%@:%@”,strName,Error.description);
}否则{
NSLog(@“删除项:%@”,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;
}
好的,谢谢,希望他们将来能为我们提供更好的方法:)几乎没有点符号的+1可能重复。干得好。此外,如果需要ARC实现,请删除释放调用。谢谢。我发布了一个使用
-performBlockAndWait:
@stifin:是否有任何方法可以重置所有实体中的数据,除了商店url中的一个实体??例如:假设我们有3个实体A、B和C。我想重置A和B中的数据,但不是C。C应该保持不变。该解决方案包括删除包含所有实体的整个文件。不能部分删除文件:它要么完全消失,要么不存在。在这种情况下,在删除数据存储之前,您必须找到将实体C存储到其他地方的方法