将按字符串分隔的组件添加到具有核心数据的谓词中

Posted

技术标签:

【中文标题】将按字符串分隔的组件添加到具有核心数据的谓词中【英文标题】:add componentsseparatedbystring into a predicate with core data 【发布时间】:2015-03-25 13:39:42 【问题描述】:

我有一个字符串存储在一个实体(核心数据)中,我想使用 NSFetchedResultsController 来获取数据。

字符串格式:abc,ba,x,s,d。这是一个保存为字符串的 ID 数组。

我只想获取在该字符串中至少包含一个 ID 的实体。

问题是如果我在谓词中使用 CONTAIN 并搜索“a”,我会得到错误的结果。

如果可以在谓词中添加诸如“componentsseparatedbystring”之类的内容,我可以在结果中迭代并使用“in”,或者如果有其他解决方案,请告诉我,谢谢。

【问题讨论】:

【参考方案1】:

您可以在谓词中使用“MATCHES”运算符,该运算符执行 正则表达式匹配:

NSString *searchID = @"a";
NSString *pattern = [NSString stringWithFormat:@"(^|.*,)%@(,.*|$)",
                     [NSRegularExpression escapedPatternForString:searchID]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ID MATCHES %@", pattern];

模式(^|.*,)TERM(,.*|$) 搜索前面的TERM 由字符串的开头或逗号开始,然后是 字符串结尾或其他逗号。

【讨论】:

【参考方案2】:

首先将您的 ID 数组转换为 NSArray:

NSArray *arrayOfIds = [stringOfIds componentsSeparatedByString:@","];

然后在您的 fetch 上使用 IN 谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ID IN %@", arrayOfIds];

这假设您的数据库列称为“ID”,并且您的 ID 的逗号分隔字符串是 stringOfIds。

【讨论】:

正如我所说,我绝对可以使用 nsfetched 结果返回的数组,所以我不能使用这个解决方案。【参考方案3】:

最后我将使用一个肮脏的解决方案:我们有 4 种可能性:

    字符串格式=a 字符串格式=a,.. 字符串格式= ..,a 字符串格式= ..,a,..

所以谓词可以是:

[NSPredicate predicateWithFormat:@"(ID LIKE %@ OR
ID CONTAINS %@ OR
ID CONTAINS %@ OR 
ID ENDSWITH %@)",
searchedID,
[NSString stringWithFormat:@"%@,", searchedID],
[NSString stringWithFormat:@",%@", searchedID],
[NSString stringWithFormat:@",%@,", searchedID]]

但这是一个肮脏的解决方案,我真的想要更清洁的东西。

【讨论】:

以上是关于将按字符串分隔的组件添加到具有核心数据的谓词中的主要内容,如果未能解决你的问题,请参考以下文章

具有多对多谓词的核心数据

与包含的一对多关系的核心数据谓词

如何将按下按钮时的数据添加到 Vue 3 的根目录或组件?

核心数据谓词对多

数据字符串中具有分隔符/特殊字符的 Redshift 卸载命令

在具有多对一/一对多关系的核心数据中构造谓词