NSPredicate 相当于 SQL 的 LIKE

问题描述 投票:0回答:4

我正在寻找一种使用

NSPredicate
设置
LIKE
条件来获取对象的方法。除此之外,
OR
也很有用。我正在尝试做一些事情,如果用户搜索“James”,我可以写一个
NSPredicate
,它的作用相当于:

select * from users where firstname LIKE '%James%' OR lastname LIKE '%James%';
iphone cocoa cocoa-touch core-data nspredicate
4个回答
129
投票
NSString *_mySearchKey = @"James";
NSPredicate *_myPredicate = [NSPredicate predicateWithFormat:@"(firstname CONTAINS[cd] %@) OR (lastname CONTAINS[cd] %@)", _mySearchKey, _mySearchKey];

39
投票

CONTAINS
运算符肯定会工作得很好。 如果您正在寻找更直接的关联,那么您还可以使用 LIKE 运算符(
*
= 0 或更多字符,
?
= 1 个字符):

NSString *_mySearchKey = @"James";
NSPredicate *_myPredicate = [NSPredicate predicateWithFormat:@"firstname LIKE '*%1$@*' OR lastname LIKE '*%1$@*'", _mySearchKey];

供参考:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-215868


10
投票

另一种可能性

@"firstname beginswith[c] James"

作为 contains 的一个不错的替代品

有时包含并不总是正确的答案


0
投票

SWIFT 相当于 SQL 的示例:

SELECT `ZNAME`
FROM `ZWHITEDOMAINS`
WHERE (`ZNAME` = 'domain' COLLATE NOCASE) OR (`ZNAME` like '%_.domain');

为了得到这个结果:

┌──────────────┬────────┐
│ "xyz.domain" │ YES    │
│  "xy.domain" │ YES    │
│   "x.domain" │ YES    │
│    ".domain" │ IGNORE │
│     "domain" │ YES    │
│ "xyz.doMain" │ YES    │
│  "xy.doMain" │ YES    │
│   "x.doMain" │ YES    │
│    ".doMain" │ IGNORE │
│     "doMain" │ YES    │
└──────────────┴────────┘

是:

static func selectAllByName(name: String) -> [WhiteDomains] {
    let name = "domain"
    let fetchRequest = NSFetchRequest<WhiteDomains>(entityName: "WhiteDomains")
    fetchRequest.predicate = NSPredicate(
        format: "(name ==[c] %@) OR (name like[c] %@)", name, "*?.\(name)"
    )
    return try! self.context.fetch(
        fetchRequest
    )
}

附注SQL 转储是:

CREATE TABLE ZWHITEDOMAINS (
  `ZNAME` VARCHAR
);

INSERT INTO ZWHITEDOMAINS(`ZNAME`) VALUES('xyz.domain');
INSERT INTO ZWHITEDOMAINS(`ZNAME`)  VALUES('xy.domain');
INSERT INTO ZWHITEDOMAINS(`ZNAME`)   VALUES('x.domain');
INSERT INTO ZWHITEDOMAINS(`ZNAME`)    VALUES('.domain');
INSERT INTO ZWHITEDOMAINS(`ZNAME`)     VALUES('domain');
INSERT INTO ZWHITEDOMAINS(`ZNAME`) VALUES('xyz.doMain');
INSERT INTO ZWHITEDOMAINS(`ZNAME`)  VALUES('xy.doMain');
INSERT INTO ZWHITEDOMAINS(`ZNAME`)   VALUES('x.doMain');
INSERT INTO ZWHITEDOMAINS(`ZNAME`)    VALUES('.doMain');
INSERT INTO ZWHITEDOMAINS(`ZNAME`)     VALUES('doMain');
© www.soinside.com 2019 - 2024. All rights reserved.