Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
Cocoa CoreData模型设计:过度使用NSFETCHTREQUEST是否是设计不良模型的症状?_Cocoa_Core Data_Data Modeling - Fatal编程技术网

Cocoa CoreData模型设计:过度使用NSFETCHTREQUEST是否是设计不良模型的症状?

Cocoa CoreData模型设计:过度使用NSFETCHTREQUEST是否是设计不良模型的症状?,cocoa,core-data,data-modeling,Cocoa,Core Data,Data Modeling,核心数据对象可以通过使用NSFetchRequest或遵循与图中其他对象的关系来检索。公平地说,在设计良好的模型中,将包含足够的关系(和获取的属性),从而将NSFetchRequests的使用保持在最低限度,这是否公平 反参数是在iOS中存在NSFetchedRequestController。假设苹果相信关系和获取的属性在现有的故障/缓存中提供了令人满意的性能,那么他们就不会创建NSFetchedRequestController 在某些情况下,使用NSFetchRequest更为优越,因为核

核心数据对象可以通过使用
NSFetchRequest
或遵循与图中其他对象的关系来检索。公平地说,在设计良好的模型中,将包含足够的关系(和获取的属性),从而将
NSFetchRequests
的使用保持在最低限度,这是否公平

反参数是在iOS中存在
NSFetchedRequestController
。假设苹果相信关系和获取的属性在现有的故障/缓存中提供了令人满意的性能,那么他们就不会创建
NSFetchedRequestController

在某些情况下,使用
NSFetchRequest
更为优越,因为核心数据可以在SQLite中完成所有工作。例如,获取聚合值


有什么想法吗?我已经看了这本书。“获取托管对象”和“核心数据性能”部分提供了相关建议,但没有任何内容强烈建议关系优于获取请求,反之亦然。

一般经验法则是,数据模型越简单,获取效果越好,而数据模型越复杂,关系越好


例如,如果您的数据模型有一个没有关系的单一实体,那么抓取最适合查找孤立的托管对象。如果您有一个包含十几个实体的数据模型,所有实体都具有两个或更多关系,那么您将大量使用关系

我要说的是,人际关系和人际关系各有优缺点。作为一名开发人员,您应该知道何时适合使用其中一种。例如,以该模型为例:

--------------  1           * ------------
| Department |<------------->>| Employee |
--------------                ------------
| name       |                | name     |
--------------                | age      |
                              | salary   |
                              ------------
------------1*------------
|部门员工|
--------------                ------------
|姓名| |姓名|
--------------|年龄|
|薪水|
------------
如果要检索属于特定部门的所有员工,则应遵循“department.employees”关系。为谓词为“department==xxxx”的员工实体创建NSFetchRequest是不合适的

相反,如果您希望查找工资>x的特定部门的员工,则可以使用带有谓词“department==xxxxx AND salary>x”的NSFetchRequest。不适合使用department.employees关系检索所有员工,然后在循环中对其进行迭代以查找高收入者

总之,关系或NSFetchRequest本质上不是“好”或“坏”。只要适当地使用它们。使用关系导航对象图。使用NSFetchRequest执行子集搜索,或者在需要灵活地将结果作为字典返回或需要使用nsexpression的地方

编辑以添加:

大量的NSFETCH请求散布在代码中,这是设计糟糕的标志。我总是将数据请求封装在自定义NSManagedObject类中,并尝试在视图/视图控制器代码中不进行任何核心数据调用


我想,获取属性也是实现同样目标的一种方式。我更喜欢在代码中创建NSFetchRequest,而不是使用核心数据编辑器。它更灵活,但两种方式实际上是一样的。

在coredata中设计模型时,您应该记住,如果模式中有1、2或n个关系,则表示您的对象图将像SQL数据库一样运行,因为它只获取主行,除了您的应用程序在第一次请求中明确需要所有对象之外。事实上,出于性能原因,苹果公司鼓励在关系中拆分模型,因此,当您的模型在获取时出错时,该时刻将获取其余的。您应该关心的唯一方面是删除规则(null,cascade…),因为设计不好的删除规则可能会崩溃或影响性能。 相信我,我从未见过像核心数据这样高效的东西。创建一个强大的模型,核心数据将完成其余工作

我的一个应用程序(Mariette)使用核心数据,而另一个应用程序(billingfiles)使用SQL

有几个想法:(1)NSFetchRequest无法在应用程序启动时缓存数据。(2) Cocoa Touch的NSFetchedResultsController取代了Cocoa的NSArrayController。