Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何从核心数据中删除所有对象_Objective C_Iphone_Core Data - Fatal编程技术网

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存储到其他地方的方法