我正在寻找一种使用
NSPredicate
设置 LIKE
条件来获取对象的方法。除此之外,OR
也很有用。我正在尝试做一些事情,如果用户搜索“James”,我可以写一个 NSPredicate
,它的作用相当于:
select * from users where firstname LIKE '%James%' OR lastname LIKE '%James%';
NSString *_mySearchKey = @"James";
NSPredicate *_myPredicate = [NSPredicate predicateWithFormat:@"(firstname CONTAINS[cd] %@) OR (lastname CONTAINS[cd] %@)", _mySearchKey, _mySearchKey];
CONTAINS
运算符肯定会工作得很好。 如果您正在寻找更直接的关联,那么您还可以使用 LIKE 运算符(*
= 0 或更多字符,?
= 1 个字符):
NSString *_mySearchKey = @"James";
NSPredicate *_myPredicate = [NSPredicate predicateWithFormat:@"firstname LIKE '*%1$@*' OR lastname LIKE '*%1$@*'", _mySearchKey];
另一种可能性
@"firstname beginswith[c] James"
作为 contains 的一个不错的替代品
有时包含并不总是正确的答案
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');