根据瞬态计算值查询核心数据存储

时间:2011-10-26 19:00:46

标签: cocoa core-data cocoa-bindings

我对Core Data的更复杂部分还不熟悉。

我的应用程序有一个15K行的核心数据存储。只有一个实体。

我需要在按计算的搜索条件筛选的表格视图中显示这些行的子集,并且对于显示的每一行,添加一个我实时计算但不存储在实体中的值。

计算需要使用用户提供的几个值。

一个假设的例子:

实体:包含字段" id"," first"和" second"

用户输入:10和20

搜索/过滤条件:仅显示实体字段" id"是两个提供的数字之间的素数。 (我想在这里构建一些复杂的谓词方法?)

显示:符合条件的所有记录的所有字段,以及派生字段(不在核心数据实体中),即" id"字段和随机数,因此tableview中的每一行都包含4个字段:

" id"," first"," second", - 计算值 -

从我的阅读/谷歌搜索看来,似乎可以采用瞬态属性,但考虑到搜索条件和结果属性需要根据用户输入计算,我无法解决这个问题

有人能给我任何能帮我实现这段代码的指针吗?我现在很迷茫,我可以在书本上找到的例子也不能满足我的特殊需求,以便我尽可能地适应它们。

由于

达伦。

1 个答案:

答案 0 :(得分:1)

您需要做的第一件事就是不再考虑字段,行和列,因为这些结构实际上都不是Core Data的一部分。在这种情况下,它很重要,因为Core Data支持任意复杂的提取,但sqlite存储不支持。因此,如果您使用sqlite存储,则您的提取受到SQLite支持的限制。

在这种情况下,针对SQLite的谓词不能执行复杂的操作,例如计算属性值是否为素数。

第一种情况的最佳解决方案是添加布尔属性isPrime,然后修改id属性的setter来计算set id值是否为prime,然后设置相应地isPrime。这将存储在SQLite存储中,并且可以针对例如isPrime==YES &&((first<=%@) && (second>=%@))

第二种情况只是使用一个瞬态属性,当托管对象在内存中时,您将提供一个自定义getter来计算其值。

一个经常被忽视的选择是不使用sqlite存储,而是使用XML存储。如果数据量相对较小,例如几千个文本属性,总内存占用量为几十亿,然后XML存储将超级快,可以处理更复杂的操作。

SQLite是Core Data中发育不良的继子。它对大型数据集和低内存很有用,但随着内存变得越来越丰富,它的优势正在逐渐消失。这些天我发现自己少用它。您应该考虑在这种特殊情况下是否需要sqlite。