核心数据:我应该为每个实体编写一个数据访问对象/管理器/控制器吗?

Posted

技术标签:

【中文标题】核心数据:我应该为每个实体编写一个数据访问对象/管理器/控制器吗?【英文标题】:Core Data: should I write one data access object/manager/controller per entity? 【发布时间】:2013-11-17 03:46:23 【问题描述】:

我的核心数据模型相当简单但层次分明。一个 Person 实体有一组 Fund 实体。每个基金都有一组股票实体。每只股票都有一组价格实体。所以:

Person: to many Funds
Fund: to many Stocks
Stock: to many Prices

在架构上,我是否应该有一个类来管理每个核心数据实体的 CRUD 操作?我将其称为 DAO(数据访问对象)和管理器可互换。 此外,如果我为每个实体都有一个管理器类,如果我想获取一个 Person 实体,我会在管理器中写什么?

为了得到一个人,我不需要得到一个人的资金吗?然后使用 Fund DAO/manager 获取基金的股票;然后使用 Stock 的 DAO/manager 获取股票的价格?

这对我来说似乎是构建“完整”人所必需的。但是如果我只想获取一个人的姓氏呢?这只是 Person 中的一个字段,不需要任何关系。 getter 是否应该获取给定 Person 的整个对象图?如果我设置了一个人,我是否还需要设置他/她的所有相关对象?

谢谢!

【问题讨论】:

您如何管理 CRUD 操作在一定程度上取决于您的 UI。一个基金可能独立于一个人,换句话说,一个基金可能有不止一个人与之关联(如果这个人是基金经理,则没有)。同样,股票独立于基金。即使没有属于它的基金,股票也可以存在。因此,如果您希望能够独立创建股票、基金和人员,然后将它们关联起来,那么可能需要独立的 UI 控制器来执行此操作。我通常会喜欢这种方法,因为 if 会给你更多的灵活性。 但是,如果不了解您的具体应用程序的更多信息,就很难提出任何建议。从技术上讲,假设您没有任何强制性字段或关系,您不需要设置任何属性来在 Core Data 中创建对象。但是,您的业务规则可能需要的不仅仅是空对象。 【参考方案1】:

1.

但是如果我只想获取一个人的姓氏呢?这只是 Person 中的一个字段,不需要任何关系。 getter 是否应该获取给定 Person 的整个对象图?

当您收到Person 时,他的funds 将是错误的。 Faulting and Uniquing - Core Data Programming Guide

2.

如果我设置了一个人,我是否还需要设置他/她的所有相关对象?

不,你不需要设置他所有的相关对象,除非相关对象不是可选的。所以当你的人需要有一个基金时,你可以把基金加到这个人身上。


在我的开发习惯中,我想对人进行分类,并添加一些类方法,例如:

+ [Person newPersonWithFirstName:(NSString *)firstName lastName:(NSString *)lastName];

处理Person相关的事情。

【讨论】:

以上是关于核心数据:我应该为每个实体编写一个数据访问对象/管理器/控制器吗?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据多实体

过滤与核心数据的关系

我应该如何编写转换数据的实体框架迁移(最好使用 DbContext)?

我应该如何对我的核心数据实体中的 NSNumber 属性执行计算/更新?

核心数据迁移删除实体数据

保存数据 - 核心数据与 plist 文件