【问题标题】:Using NSPredicate to refer other NSPredicate rules使用 NSPredicate 引用其他 NSPredicate 规则
【发布时间】:2017-07-05 13:14:51
【问题描述】:

假设我有一个用于NSPredicate 规则的核心数据数据库。

enum PredicateType,Int {
case beginswith
case endswith
case contains
}

我的数据库如下所示

+------+-----------+
| Type |  Content  |
+------+-----------+
|    0 | Hello     |
|    1 | end       |
|    2 | somevalue |
|    0 | end       |
+------+-----------+

我有一个内容“这是结束”。如何查询 Core Data 以检查是否有任何规则满足此内容?它应该在桌子上找到第二个条目

+------+-----------+
| Type |  Content  |
+------+-----------+
|    1 | end       |
+------+-----------+

但不应该找到

+------+-----------+
| Type |  Content  |
+------+-----------+
|    0 | end       |
+------+-----------+

因为这句话中end不在开头。

目前我正在获取所有值,使用 Content 和 Type 创建谓词并再次查询数据库,我认为这是一个很大的开销。

【问题讨论】:

  • 你只有3种吗?
  • 我现在有 3 种类型,但我打算增加类型。我想您想建议,检查所有 3 种类型并检查是否匹配?但这也是一个小表,我还有谓词的其他属性以及不区分大小写等。
  • 我不太明白。你有一个或两个数据库,其中一个是价值和内容?您要查询哪个数据库?
  • 我有包含NSPredicate 规则的数据库,例如BEGINSWITH, ENDSWITH, CONTAINS 我想查询数据库中的所有规则,以了解是否有适合内容的NSPredicate 规则。
  • 我会将规则加载到内存中,为每个规则创建(或存储/加载)谓词并使用块过滤规则。另一个想法(不知道是否可行):在数据库中添加一个正则表达式并使用诸如“'This is end' MATCHES contentRegex”之类的谓词。

标签: swift core-data nspredicate


【解决方案1】:

他们现在这样做的方式是正确的。您首先需要构建您的谓词(在您的情况下这是非常复杂的操作,还需要获取)并运行每个谓词以查看哪个谓词匹配。

我不会这么快就认为这会产生巨大的开销。如果您的数据集很小(

如果您发现应用运行速度过慢,请使用仪器查看问题所在。我可以看到有两个可能的地方存在性能问题 - 1)从数据库中获取所有谓词和 2)所有谓词的运行。

如果您想让获取速度更快,那么我建议您使用NSFetchedResultsController。虽然它通常用于使数据与 tableview 保持同步,但它可用于您希望随时获得正确数据的任何数据。使用控制器,您可以进行一次提取,然后它会监控核心数据并保持自己的数据。然后,当您需要所有谓词而不是进行提取时,您只需访问控制器的fetchedObjects 属性。

如果您发现运行所有谓词都需要很长时间,那么您可以通过巧妙地使用二分搜索来改进 beginWith 和 endsWith 的运行。您保留两个自定义谓词对象数组,一个按字母顺序排序,另一个将所有受尊敬的字符串按字母顺序排序。要查找它以哪个字符串开头,请使用indexOfObject:inSortedRange:options:usingComparator: 查找相关对象。如果不知道如何改进包含。您可以查看在对象上运行字符串方法是否比 NSPredicate 方法更快。您也可以尝试在后台线程上同时运行谓词。

同样,除非您发现自己需要这样做,否则您不应该这样做。如果您的数据集很小,那么您现在的做法就可以了。

【讨论】:

  • 感谢您的详细回答。我不能为此使用NSFetchedResultsController,因为它是一种实用方法,内容进来结果出来。我希望通过一些很酷的 SQL 技巧或使用 SUBQUERYSELF 或其他东西来找到答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多