NSPredicate --(謂詞查詢) Foundation提供的類,它指定資料被獲取或者過濾的方式
NSPredicate是一個Foundation類,它指定資料被獲取或者過濾的方式。它的查詢語言就像SQL的WHERE和正則表示式的交叉一樣,提供了具有表現力的,自然語言介面來定義一個集合被搜尋的邏輯條件。
相比較抽象的談論它,展示NSPredicate的使用方法更加容易,所以我們來重新審視NSSortDescriptor中使用的示例資料集吧:索引 | 1 | 2 | 3 | 4 |
名 | Alice | Bob | Charlie | Quentin |
姓 | Smith | Jones | Smith | Alberts |
年齡 | 24 | 27 | 33 | 31 |
集合中使用NSPredicate Foundation提供使用謂詞(predicate)來過濾NSArray/NSMutableArray&NSSet/NSMutableSet的方法。 不可變的集合,NSArray&NSSet,有可以通過評估接收到的predicate來返回一個不可變集合的方法filteredArrayUsingPredicate:和filteredSetUsingPredicate:。 可變集合,NSMutableArray&NSMutableSet,可以使用方法filterUsingPredicate:,它可以通過執行接收到的謂詞來移除評估結果為FALSE的物件。 NSDictionary可以用謂詞來過濾它的鍵和值(兩者都為NSArray物件)。NSOrderedSet可以由過濾的NSArray或NSSet生成一個新的有序的集,或者NSMutableSet可以簡單的removeObjectsInArray:,來傳遞通過否定predicate過濾的物件。 Core Data中使用NSPredicate NSFetchRequest有一個predicate屬性,它可以指定管理物件應該被獲取的邏輯條件。謂詞的使用規則在這裡同樣適用,唯一的區別在於,在管理物件環境中,謂詞由持久化儲存助理(persistent store coordinator)評估,而不像集合那樣在記憶體中被過濾。 謂詞語法 替換 %@是對值為字串,數字或者日期的物件的替換值。 %K是key path的替換值。
- @interface Person : NSObject
- @property NSString *firstName;
- @property NSString *lastName;
- @property NSNumber *age;
- @end
- @implementation Person
- - (NSString *)description {
- return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
- }
- @end
- #pragma mark -
- NSArray *firstNames = @[ @"Alice"
, @"Bob", @"Charlie", @"Quentin" ];- NSArray *lastNames = @[ @"Smith", @"Jones", @"Smith", @"Alberts" ];
- NSArray *ages = @[ @24, @27, @33, @31 ];
- NSMutableArray *people = [NSMutableArray array];
- [firstNames enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
- Person *person = [[Person alloc] init];
- person.firstName = firstNames[idx];
- person.lastName = lastNames[idx];
- person.age = ages[idx];
- [people addObject:person];
- }];
- NSPredicate *bobPredicate = [NSPredicate predicateWithFormat:@"firstName = 'Bob'"];
- NSPredicate *smithPredicate = [NSPredicate predicateWithFormat:@"lastName = %@", @"Smith"];
- NSPredicate *thirtiesPredicate = [NSPredicate predicateWithFormat:@"age >= 30"];
- // ["Bob Jones"]
- NSLog(@"Bobs: %@", [people filteredArrayUsingPredicate:bobPredicate]);
- // ["Alice Smith", "Charlie Smith"]
- NSLog(@"Smiths: %@", [people filteredArrayUsingPredicate:smithPredicate]);
- // ["Charlie Smith", "Quentin Alberts"]
- NSLog(@"30's: %@", [people filteredArrayUsingPredicate:thirtiesPredicate]);
$VARIABLE_NAME是可以被NSPredicate -predicateWithSubstitutionVariables:替換的值。
- NSPredicate *ageIs33Predicate = [NSPredicate predicateWithFormat:@"%K = %@", @"age", @33];
- // ["Charlie Smith"]
- NSLog(@"Age 33: %@", [people filteredArrayUsingPredicate:ageIs33Predicate]);
基本比較 =, ==:左邊的表示式和右邊的表示式相等。 >=, =>:左邊的表示式大於或者等於右邊的表示式。 <=, =<:左邊的表示式小於等於右邊的表示式。 >:左邊的表示式大於右邊的表示式。 <:左邊的表示式小於右邊的表示式。 !=, <>:左邊的表示式不等於右邊的表示式。 BETWEEN:左邊的表示式等於右邊的表示式的值或者介於它們之間。右邊是一個有兩個指定上限和下限的數值的數列(指定順序的數列)。比如,1 BETWEEN { 0 , 33 },或者$INPUT BETWEEN { $LOWER, $UPPER }。 基本複合謂詞 AND, &&:邏輯與. OR, ||:邏輯或. NOT, !:邏輯非. 字串比較 字串比較在預設的情況下是區分大小寫和音調的。你可以在方括號中用關鍵字元c和d來修改操作符以相應的指定不區分大小寫和變音符號,比如firstname BEGINSWITH[cd] $FIRST_NAME。 BEGINSWITH:左邊的表示式以右邊的表示式作為開始。 CONTAINS:左邊的表示式包含右邊的表示式。 ENDSWITH:左邊的表示式以右邊的表示式作為結束。 LIKE:左邊的表示式等於右邊的表示式:?和*可作為萬用字元,其中?匹配1個字元,*匹配0個或者多個字元。 MATCHES:左邊的表示式根據ICU v3(更多內容請檢視ICU User Guide for Regular Expressions)的regex風格比較,等於右邊的表示式。 合計操作 關係操作 ANY,SOME:指定下列表達式中的任意元素。比如,ANY children.age < 18。 ALL:指定下列表達式中的所有元素。比如,ALL children.age < 18。 NONE:指定下列表達式中沒有的元素。比如,NONE children.age < 18。它在邏輯上等於NOT (ANY ...)。 IN:等於SQL的IN操作,左邊的表達必須出現在右邊指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。 陣列操作 array[index]:指定陣列中特定索引處的元素。 array[FIRST]:指定陣列中的第一個元素。 array[LAST]:指定陣列中的最後一個元素。 array[SIZE]:指定陣列的大小。 布林值謂詞 TRUEPREDICATE:結果始終為真的謂詞。 FALSEPREDICATE:結果始終為假的謂詞。 NSCompoundPredicate 我們見過與&或被用在謂詞格式字串中以建立複合謂詞。然而,我們也可以用NSCompoundPredicate來完成同樣的工作。 例如,下列謂詞是相等的:
- NSPredicate *namesBeginningWithLetterPredicate = [NSPredicate predicateWithFormat:@"(firstName BEGINSWITH[cd] $letter) OR (lastName BEGINSWITH[cd] $letter)"];
- // ["Alice Smith", "Quentin Alberts"]
- NSLog(@"'A' Names: %@", [people filteredArrayUsingPredicate:[namesBeginningWithLetterPredicate predicateWithSubstitutionVariables:@{@"letter": @"A"}]]);
雖然語法字串文字更加容易輸入,但是在有的時候,你需要結合現有的謂詞。在那些情況下,你可以使用NSCompoundPredicate -andPredicateWithSubpredicates:&-orPredicateWithSubpredicates:。 NSComparisonPredicate 同樣的,如果你在讀過上週的文章之後發現你使用了太多的NSExpression的話,NSComparisonPredicate可以幫助你解決這個問題。 就像NSCompoundPredicate一樣,NSComparisonPredicate從子部件構建了一個NSPredicate--在這種情況下,左側和右側都是NSExpression。 分析它的類的建構函式可以讓我們一窺NSPredicate的格式字串是如何解析的:
- [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"age > 25"], [NSPredicate predicateWithFormat:@"firstName = %@", @"Quentin"]]];
- [NSPredicate predicateWithFormat:@"(age > 25) AND (firstName = %@)", @"Quentin"];
引數 lhs:左邊的表示式。 rhs:右邊的表示式。 modifier:應用的修改符。(ANY或者ALL) type:謂詞運算子型別。 options:要應用的選項。沒有選項的話則為0。 NSComparisonPredicate型別
- + (NSPredicate *)predicateWithLeftExpression:(NSExpression *)lhs
- rightExpression:(NSExpression *)rhs
- modifier:(NSComparisonPredicateModifier)modifier
- type:(NSPredicateOperatorType)type
- options:(NSUInteger)options
NSComparisonPredicate選項 NSCaseInsensitivePredicateOption:不區分大小寫的謂詞。你通過在謂詞格式字串中加入後面帶有[c]的字串操作(比如,"NeXT" like[c] "next")來表達這一選項。 NSDiacriticInsensitivePredicateOption:忽視發音符號的謂詞。你通過在謂詞格式字串中加入後面帶有[d]的字串操作(比如,"naïve" like[d] "naive")來表達這一選項。 NSNormalizedPredicateOption:表示待比較的字串已經被預處理了。這一選項取代了NSCaseInsensitivePredicateOption和NSDiacriticInsensitivePredicateOption,旨在用作效能優化的選項。你可以通過在謂詞格式字串中加入後面帶有[n]的字串(比如,"WXYZlan" matches[n] ".lan")來表達這一選項。 NSLocaleSensitivePredicateOption:表明要使用<,<=,=,=>,> 作為比較的字串應該使用區域識別的方式處理。你可以通過在<,<=,=,=>,>其中之一的操作符後加入[l](比如,"straße" >[l] "strasse")以便在謂詞格式字串表達這一選項。 Block謂詞 最後,如果你實在不願意學習NSPredicate的格式語法,你也可以學學NSPredicate +predicateWithBlock:。
- enum {
- NSLessThanPredicateOperatorType = 0,
- NSLessThanOrEqualToPredicateOperatorType,
- NSGreaterThanPredicateOperatorType,
- NSGreaterThanOrEqualToPredicateOperatorType,
- NSEqualToPredicateOperatorType,
- NSNotEqualToPredicateOperatorType,
- NSMatchesPredicateOperatorType,
- NSLikePredicateOperatorType,
- NSBeginsWithPredicateOperatorType,
- NSEndsWithPredicateOperatorType,
- NSInPredicateOperatorType,
- NSCustomSelectorPredicateOperatorType,
- NSContainsPredicateOperatorType,
- NSBetweenPredicateOperatorType
- };
- typedef NSUInteger NSPredicateOperatorType;
...好吧,雖然使用predicateWithBlock:是懶人的做法,但它也並不是一無是處。 事實上,因為block可以封裝任意的計算,所以有一個查詢類是無法以NSPredicate格式字串形式來表達的(比如對執行時被動態計算的值的評估)。而且當同一件事情可以用NSExpression結合自定義選擇器來完成時,block為完成工作提供了一個方便的介面。 重要提示:由predicateWithBlock:生成的NSPredicate不能用於由SQLite儲存庫支援的Core Data資料的提取要求。 我知道我已經說過很多次了,可是NSPredicate真的是Cocoa的優勢之一。其他語言的第三方庫如果能有它一半的能力就已經很幸運了--更別提標準庫了。對於我們這些應用和框架開發者來說,有它作為標準組件使得我們在處理資料時有了很大的優勢。 和NSExpression一樣,NSPredicate一直在提醒我們Foundation有多麼好:它不僅僅十分有用,它精緻的構架和設計也是我們寫程式碼時靈感的來源。 ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
- NSPredicate *shortNamePredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
- return [[evaluatedObject firstName] length] <= 5;
- }];
- // ["Alice Smith", "Bob Jones"]
- NSLog(@"Short Names: %@", [people filteredArrayUsingPredicate:shortNamePredicate]);
簡述:Cocoa框架中的NSPredicate用於查詢,原理和用法都類似於SQL中的where,作用相當於資料庫的過濾取。
定義(最常用到的方法):
- NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...];
(1)比較運算子>,<,==,>=,<=,!=
可用於數值及字串
例:@"number > 100"
(2)範圍運算子:IN、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','beijing'}"
(3)字串本身:SELF
例:@“SELF == ‘APPLE’"
(4)字串相關:BEGINSWITH、ENDSWITH、CONTAINS
例:@"name CONTAIN[cd] 'ang'" //包含某個字串
@"name BEGINSWITH[c] 'sh'" //以某個字串開頭
@"name ENDSWITH[d] 'ang'" //以某個字串結束
注:[c]不區分大小寫[d]不區分發音符號即沒有重音符號[cd]既不區分大小寫,也不區分發音符號。
(5)萬用字元:LIKE
例:@"name LIKE[cd] '*er*'" //*代表萬用字元,Like也接受[cd].
@"name LIKE[cd] '???er*'"
(6)正則表示式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A開頭,e結尾
@"name MATCHES %@",regex
實際應用:
(1)對NSArray進行過濾
- NSArray *array = [[NSArray alloc]initWithObjects:@"beijing",@"shanghai",@"guangzou",@"wuhan", nil];
- NSString *string = @"ang";
-
相關推薦
NSPredicate --(謂詞查詢) Foundation提供的類,它指定資料被獲取或者過濾的方式
NSPredicate是一個Foundation類,它指定資料被獲取或者過濾的方式。它的查詢語言就像SQL的WHERE和正則表示式的交叉一樣,提供了具有表現力的,自然語言介面來定義一個集合被搜尋的邏輯條件。 相比較抽象的談論它,展示NSPredicate的
robotframework 學習(4) :介面測試,返回json資料的獲取和驗證
一、前言 上一篇部落格寫了怎麼從excel文件中獲取資料和傳參到介面當中,這一篇文章就記錄一下,獲取到介面返回的引數後的怎麼解析json資料。 二、具體步驟 1、之前看到其
獲取指定目錄下的資料夾(包含檔案)並且拷貝到另一指定資料夾下,刪除指定目錄下的資料夾(包含檔案)
/** * 複製整個資料夾內容 * * @param oldPath *
全棧JavaScript之路(十六)HTML5 HTMLDocument 類型的變化
complete 文檔 出了 content ldoc 之路 stat javascrip safari HTML5 擴展了 HTMLDocument, 添加了新的功能。 1.document.readState = ‘loading‘ || ‘complet
第十一章 springboot + mongodb(簡單查詢)
req all bool pan 可能 set 如果 創建 使用 1、mongodb在mac上的安裝 下載mongodb,https://www.mongodb.org/ 解壓縮到一個指定文件夾,如:/Users/enniu1/Desktop/zjg/mongodb
html5 響應式布局(媒體查詢)
href 高級 ont spa 問題 界面 p s ide display 響應式布局 響應式布局,簡而言之,就是一個網站能夠兼容多個終端——而不是為每個終端做一個特定的版本。這個概念是為解決移動互聯網瀏覽而誕生的。 響應式布局可以為不同終端
GITHUB(1.5)GitHub提供的主要功能
pos bsp 自動生成 lan 一支 評論 手冊 倉庫 wiki Git 倉庫 一般情況下,我們可以免費建立任意個GitHub提供的Git 倉庫。但如果需要建立只對特定人物或只對自己公開的私有倉庫,則需要依照套餐類型支付每月最低7美元的使用費。 詳見 https://gi
索引(快速查詢)
數據量 EDA led 數據 哪些 如果 參考 類型 rom 《沁園春·雪》 北國風光,千裏冰封,萬裏雪飄。 望長城內外,惟餘莽莽;大河上下,頓失滔滔。 山舞銀蛇,原馳蠟象,欲與天公試比高。 須晴日,看紅妝素裹,分外妖嬈。 江山如此多嬌,引無數英雄竟折腰。 惜秦皇漢武,略輸
C++語言學習(十五)——C++抽象類與接口
eight close send 都是 () 實例 amp 定義類 esp C++語言學習(十五)——C++抽象類與接口 一、抽象類與接口 1、抽象類簡介 面向對象的抽象類用於表示現實世界的抽象概念,是一種只能定義類型,不能產生對象的類(不能實例化),只能被繼承並被重寫相關
真題2001 折半查詢(二分查詢)
題目:折半查詢(二分查詢),她僅適合有序的順序表。 基本思想:首先將給定值key與表中中間位置元素的關鍵字比較,若想等,則查詢成功,返回該元素的儲存位置;若不等則查詢元素只能在中間元素以外的前半部分或者後半部分。然後在縮小的範圍內繼續進行同樣的查詢,如此重複直到找到為止,或者確定表中沒有所需
java基礎學習總結(十五):抽象類與介面
抽象類與介面是java語言中對抽象概念進行定義的兩種機制,正是由於他們的存在才賦予java強大的面向物件的能力。他們兩者之間對抽象概念的支援有很大的相似,甚至可以互換,但是也有區別。 一、抽象類 &n
Java 013 StringBuffer類、Arrays類(常見排序)、包裝類(Integer類)
知識點梳理 心得體會 小知識點 1.執行緒安全與不安全 概念:程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。執行緒安全的程式,多程序需要訪
Java第一階段(10)【 Object類,equals方法,四大許可權修飾符】 11.19
第一階段 Object 類 方法 toString() 方法equals() java四大許可權修飾符 java中所有基本資料型別所對應的引用資料型別 快捷鍵 Object 類 Object:所有類的祖宗,
搭建ERP(條件查詢)
1、條件查詢採用離線條件查詢的方法 /** * 條件查詢 */ public List<Dep> getList(Dep dep1) { DetachedCriteria dc = DetachedCriteria.forClass(Dep.class); if(n
使用mybatis的動態sql來完成 SQL 多條件組合查詢(模糊查詢)
對於一般的模糊查詢,沒有使用框架的連結部落格地址:點選這裡 對於mybatis,框架內部欸出了處理方式,即使用mybatis的內建標籤和OGNL表示式 mybatis在select,update,delete,insert等標籤中加入了 if choose (when, ot
七牛雲java(服務端)通用工具類
前言 需要安裝lombok外掛。 功能列表 上傳本地檔案 上傳Base64圖片 獲取檔案訪問地址 上傳MultipartFile 程式碼 pom.xml <dependency> <groupId>c
Java筆記(十一)通用容器類和總結
結構 翻轉 隨機 抽象 clear out 內部類 依賴 keys 通用容器類和總結 一、抽象容器類 一)AbstractCollection 提供了Collection接口的基礎實現,具體來說,實現了如下方法: public boolean addAll(Collec
MySQL(5) 之 DQL查詢(排序查詢)
排序查詢 order by [asc(升序,預設的)|desc(降序)] order by 支援單個欄位,多個欄位,表示式,函式,別名 放在sql語句的最後面(limit 子句 除外); SELECT * FROM employees ORDER BY salar
最大化平均值(二分查詢)
int n,k; int w[max_n]; int v[max_n]; double y[max_n]; bool c(double x) { for(int i=0;i<n;i++) y[i]=v[i]-x*w[i]; sort(y,
java操作mongodb(高階查詢)
直接上程式碼(依賴程式碼請檢視之前的部落格): public void query() { // $or (查詢id等於1或者id等於2的資料) BasicDBObject queryObject = new BasicDBObject().appen