我可以将NSFetchedResultsController放在托管对象类中吗?

时间:2011-01-31 13:21:32

标签: objective-c core-data entity nsfetchedresultscontroller

我厌倦了在我使用托管对象上下文的几乎每个文件中不断地为我的项目添加/重复NSFetchedResultsController代码。

我想减少重复代码的数量。我想在模型类中放置这种重复的类似CRUD的代码。

我想要的是将所有自定义NSFetch放在相关实体的托管对象类中(即:Company.m,Employee.m)。

即使Apple的Core Books示例代码也没有将此代码放入托管对象类中,我想知道它是否可能?

我尝试将代码粘贴到我的Company.m类中但是它一直在抱怨managedObjectContext并且它还抱怨fetchedResultsController没有声明,即使它是一个参数?

理想情况下,我想在实体管理对象类中添加许多不同类型的获取请求/结果控制器内容。

但在我超越自我之前,是否有可能只将所有NSFetchedResultsController内容放入Entity Managed Object类中?

如果有一个示例教程或项目或源代码涵盖了这一点,那也很棒。

感谢。

(代码示例如下)。

/**
 Returns the fetched results controller. Creates and configures the controller if necessary.
 */
- (NSFetchedResultsController *)fetchedResultsController
{

    if (fetchedResultsController != nil) {
        return fetchedResultsController;
    }

    // Create and configure a fetch request with the Book entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Company" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    // Create the sort descriptors array.
    NSSortDescriptor *authorDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:authorDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    // Create and initialize the fetch results controller.
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"author" cacheName:@"Root"];
    self.fetchedResultsController = aFetchedResultsController;
    fetchedResultsController.delegate = self;

    // Memory management.
    [aFetchedResultsController release];
    [fetchRequest release];
    [authorDescriptor release];
    [sortDescriptors release];

    return fetchedResultsController;
}    

1 个答案:

答案 0 :(得分:2)

我建议将ActiveRecord与xmod一起使用。如果修改核心数据模型,CoreData将覆盖您的CRUD。 ActiveRecord让它像调用[MyManagedObject createEntity];NSArray *myObjects = [MyManagedObject findAll];一样简单。还有一些选项可以传递谓词来过滤findAll调用。 xmod添加为生成的类生成一个子类,以便您可以向实体添加自定义逻辑,以便它们不会被覆盖。

编辑:我想添加这个 Active Record 实现的链接,因为这是我实际使用的那个。

Edit2:现在已将其重命名为Magical Record