菜鸟教程小白 发表于 2022-12-12 20:41:50

iPhone iOS如何在删除实体时删除从Core Data实体嵌套关系引用的本地文件?


                                            <p><p>我有一个核心数据模型定义如下:</p>

<p>一个用户有很多事件。每个事件可以有许多图片。关系具有“级联”删除规则。</p>

<p><strong>我正在尝试了解如何在实体消失时删除本地文件。核心数据实体在消失之前是否会调用某种 dealloc 或“finalize”方法?</strong></p>

<p>每个图片实体都有一个对存储在应用文档目录中的本地文件的引用。</p>

<p>当通过table view的commitEditingStyle删除用户时,我可以通过关系逐步删除图像并手动删除文件:</p>

<pre><code>- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    {
      // Delete the managed object for the given index path
      NSManagedObjectContext *context = [[ objectStore] managedObjectContext];

      AppUser* managedObject = ;

      //clean up local files before deleting the object
      ;      

//now delete the object
      ;

      // Save the context to remember deletion
      NSError* error = nil;
      if (!) {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
             */
            NSLog(@&#34;Unresolved error %@, %@&#34;, error, );
            abort();
      }

    }

}
</code></pre>

<p><strong>但是,当通过其他方法删除实体时,当我的获取结果 Controller 收到通知时,嵌套关系不包含任何对象。</strong>用户的事件集将没有任何实体可以单步执行并删除本地内容。这是为关系设置“级联”删除规则的结果吗?</p>

<pre><code>- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
//    UITableView *tableView = self.tableView;
//   
    AppUser* managedObject = anObject;
    switch(type) {
      case NSFetchedResultsChangeInsert:
             withRowAnimation:UITableViewRowAnimationNone];
//             withRowAnimation:UITableViewRowAnimationFade];
            //             atIndexPath:newIndexPath];
            break;

      case NSFetchedResultsChangeDelete:
             withRowAnimation:UITableViewRowAnimationNone];


            //these methods cannot find any content to delete
            ;
            ;
            break;

      case NSFetchedResultsChangeUpdate:
             atIndexPath:newIndexPath];

            ;
            break;

      case NSFetchedResultsChangeMove:
             withRowAnimation:UITableViewRowAnimationFade];
            withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以在 <code>NSManagedObject</code> 子类中实现 <code>prepareForDeletion</code> 方法。它在删除对象之前自动调用,因此您也可以从那里删除引用的文件。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iPhone iOS如何在删除实体时删除从Core Data实体嵌套关系引用的本地文件?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/10419201/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/10419201/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iPhone iOS如何在删除实体时删除从Core Data实体嵌套关系引用的本地文件?