【问题标题】:how to remove all objects from Core Data如何从核心数据中删除所有对象
【发布时间】:2011-03-17 00:23:56
【问题描述】:

如何删除所有对象?我知道我可以删除一个

[managedObjectContext deleteObject:objToDelete];

是否可以在不迭代所有数组的情况下全部删除? 谢谢

【问题讨论】:

标签: objective-c iphone core-data


【解决方案1】:

只需迭代数组并删除它们。没有明确的方法可以将它们全部删除。

【讨论】:

  • 好的,谢谢你,希望他们以后能为我们提供更好的方法:)
【解决方案2】:

您也可以只拆除堆栈(释放NSManagedObjectContextNSPersistentStoreNSManagedObjectModel)并删除文件。可能比遍历整个数据库并单独删除每个对象要快。

此外,他们将来不太可能提供此功能,因为删除文件很容易。但是,如果您认为这很重要,请提交雷达并让 Apple 知道。否则他们不会知道有多少人想要这个功能。

【讨论】:

    【解决方案3】:

    将对象标记为删除然后保存的工作方式是这样的,因为 Core Data 仍然需要为所有被删除的对象运行验证规则。毕竟,对象可以根据它对-validateForDelete: 的响应方式拒绝删除。

    如果:

    • 您确实想删除持久存储中的所有内容
    • 并且关心该持久存储中的对象是否表明它们可以删除

    然后:

    • 拆除使用该持久存储的 Core Data 堆栈
    • 并删除持久存储的文件。

    【讨论】:

      【解决方案4】:

      这就是我“重置”我的数据存储的方法:

      - (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;
          }
      }
      

      【讨论】:

      • +1 表示几乎没有点符号。干得好。此外,如果您需要 ARC 实现,请删除发布调用。
      • 谢谢。我发布了一个使用-performBlockAndWait:的修改版本
      • @stifin :有什么方法可以重置所有实体中的数据,但商店网址中的一个除外?例如:假设我们有 3 个实体 A、B 和 C。我想重置 A 和 B 中的数据,但不是 C。C 应该保持不变。无论如何,这可以实现吗?
      • @ASN 此解决方案涉及删除包含所有实体的整个文件。您不能部分删除文件:它要么完全消失,要么没有。在这种情况下,您必须在删除数据存储之前找到将实体 C 存储在其他位置的方法。
      【解决方案5】:

      此函数从磁盘中删除当前的 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];
      

      不要忘记导入标头。

      【讨论】:

      • 快速简单 - 我喜欢它,谢谢分享 ;-)
      【解决方案6】:

      当您删除所有缓存和文档时,您正在删除数据库。不是对 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);
              }
          }
      }
      

      【讨论】:

        【解决方案7】:

        我使用了 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-07
          • 2011-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-07
          • 1970-01-01
          • 2012-06-17
          相关资源
          最近更新 更多