1. 程式人生 > >NSPredicate --(謂詞查詢) Foundation提供的類,它指定資料被獲取或者過濾的方式

NSPredicate --(謂詞查詢) Foundation提供的類,它指定資料被獲取或者過濾的方式

 NSPredicate是一個Foundation類,它指定資料被獲取或者過濾的方式。它的查詢語言就像SQL的WHERE和正則表示式的交叉一樣,提供了具有表現力的,自然語言介面來定義一個集合被搜尋的邏輯條件。

相比較抽象的談論它,展示NSPredicate的使用方法更加容易,所以我們來重新審視NSSortDescriptor中使用的示例資料集吧:
索引 1 2 3 4
Alice Bob Charlie Quentin
Smith Jones Smith Alberts
年齡 24 27 33 31
  1. @interface Person : NSObject 
  2. @property NSString *firstName; 
  3. @property NSString *lastName; 
  4. @property NSNumber *age; 
  5. @end 
  6. @implementation Person 
  7. - (NSString *)description { 
  8.     return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; 
  9. @end 
  10. #pragma mark -
  11. NSArray *firstNames = @[ @"Alice"
    , @"Bob", @"Charlie", @"Quentin" ]; 
  12. NSArray *lastNames = @[ @"Smith", @"Jones", @"Smith", @"Alberts" ]; 
  13. NSArray *ages = @[ @24, @27, @33, @31 ]; 
  14. NSMutableArray *people = [NSMutableArray array]; 
  15. [firstNames enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
  16.     Person *person = [[Person alloc] init]; 
  17.     person.firstName = firstNames[idx]; 
  18.     person.lastName = lastNames[idx]; 
  19.     person.age = ages[idx]; 
  20.     [people addObject:person]; 
  21. }]; 
  22. NSPredicate *bobPredicate = [NSPredicate predicateWithFormat:@"firstName = 'Bob'"]; 
  23. NSPredicate *smithPredicate = [NSPredicate predicateWithFormat:@"lastName = %@", @"Smith"]; 
  24. NSPredicate *thirtiesPredicate = [NSPredicate predicateWithFormat:@"age >= 30"]; 
  25. // ["Bob Jones"]
  26. NSLog(@"Bobs: %@", [people filteredArrayUsingPredicate:bobPredicate]); 
  27. // ["Alice Smith", "Charlie Smith"]
  28. NSLog(@"Smiths: %@", [people filteredArrayUsingPredicate:smithPredicate]); 
  29. // ["Charlie Smith", "Quentin Alberts"]
  30. NSLog(@"30's: %@", [people filteredArrayUsingPredicate:thirtiesPredicate]); 
集合中使用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的替換值。
  1. NSPredicate *ageIs33Predicate = [NSPredicate predicateWithFormat:@"%K = %@", @"age", @33]; 
  2. // ["Charlie Smith"]
  3. NSLog(@"Age 33: %@", [people filteredArrayUsingPredicate:ageIs33Predicate]); 
$VARIABLE_NAME是可以被NSPredicate -predicateWithSubstitutionVariables:替換的值。
  1. NSPredicate *namesBeginningWithLetterPredicate = [NSPredicate predicateWithFormat:@"(firstName BEGINSWITH[cd] $letter) OR (lastName BEGINSWITH[cd] $letter)"]; 
  2. // ["Alice Smith", "Quentin Alberts"]
  3. NSLog(@"'A' Names: %@", [people filteredArrayUsingPredicate:[namesBeginningWithLetterPredicate predicateWithSubstitutionVariables:@{@"letter": @"A"}]]); 
基本比較 =, ==:左邊的表示式和右邊的表示式相等。 >=, =>:左邊的表示式大於或者等於右邊的表示式。 <=, =<:左邊的表示式小於等於右邊的表示式。 >:左邊的表示式大於右邊的表示式。 <:左邊的表示式小於右邊的表示式。 !=, <>:左邊的表示式不等於右邊的表示式。 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來完成同樣的工作。 例如,下列謂詞是相等的:
  1. [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"age > 25"], [NSPredicate predicateWithFormat:@"firstName = %@", @"Quentin"]]]; 
  2. [NSPredicate predicateWithFormat:@"(age > 25) AND (firstName = %@)", @"Quentin"]; 
雖然語法字串文字更加容易輸入,但是在有的時候,你需要結合現有的謂詞。在那些情況下,你可以使用NSCompoundPredicate -andPredicateWithSubpredicates:&-orPredicateWithSubpredicates:。 NSComparisonPredicate 同樣的,如果你在讀過上週的文章之後發現你使用了太多的NSExpression的話,NSComparisonPredicate可以幫助你解決這個問題。 就像NSCompoundPredicate一樣,NSComparisonPredicate從子部件構建了一個NSPredicate--在這種情況下,左側和右側都是NSExpression。 分析它的類的建構函式可以讓我們一窺NSPredicate的格式字串是如何解析的:
  1. + (NSPredicate *)predicateWithLeftExpression:(NSExpression *)lhs 
  2.                              rightExpression:(NSExpression *)rhs 
  3.                                     modifier:(NSComparisonPredicateModifier)modifier 
  4.                                         type:(NSPredicateOperatorType)type 
  5.                                      options:(NSUInteger)options 
引數 lhs:左邊的表示式。 rhs:右邊的表示式。 modifier:應用的修改符。(ANY或者ALL) type:謂詞運算子型別。 options:要應用的選項。沒有選項的話則為0。 NSComparisonPredicate型別
  1. enum { 
  2.    NSLessThanPredicateOperatorType = 0, 
  3.    NSLessThanOrEqualToPredicateOperatorType, 
  4.    NSGreaterThanPredicateOperatorType, 
  5.    NSGreaterThanOrEqualToPredicateOperatorType, 
  6.    NSEqualToPredicateOperatorType, 
  7.    NSNotEqualToPredicateOperatorType, 
  8.    NSMatchesPredicateOperatorType, 
  9.    NSLikePredicateOperatorType, 
  10.    NSBeginsWithPredicateOperatorType, 
  11.    NSEndsWithPredicateOperatorType, 
  12.    NSInPredicateOperatorType, 
  13.    NSCustomSelectorPredicateOperatorType, 
  14.    NSContainsPredicateOperatorType, 
  15.    NSBetweenPredicateOperatorType 
  16. }; 
  17. typedef NSUInteger NSPredicateOperatorType; 
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:。
  1. NSPredicate *shortNamePredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
  2.             return [[evaluatedObject firstName] length] <= 5; 
  3.         }]; 
  4. // ["Alice Smith", "Bob Jones"]
  5. NSLog(@"Short Names: %@", [people filteredArrayUsingPredicate:shortNamePredicate]); 
...好吧,雖然使用predicateWithBlock:是懶人的做法,但它也並不是一無是處。 事實上,因為block可以封裝任意的計算,所以有一個查詢類是無法以NSPredicate格式字串形式來表達的(比如對執行時被動態計算的值的評估)。而且當同一件事情可以用NSExpression結合自定義選擇器來完成時,block為完成工作提供了一個方便的介面。 重要提示:由predicateWithBlock:生成的NSPredicate不能用於由SQLite儲存庫支援的Core Data資料的提取要求。 我知道我已經說過很多次了,可是NSPredicate真的是Cocoa的優勢之一。其他語言的第三方庫如果能有它一半的能力就已經很幸運了--更別提標準庫了。對於我們這些應用和框架開發者來說,有它作為標準組件使得我們在處理資料時有了很大的優勢。 和NSExpression一樣,NSPredicate一直在提醒我們Foundation有多麼好:它不僅僅十分有用,它精緻的構架和設計也是我們寫程式碼時靈感的來源。 ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

簡述:Cocoa框架中的NSPredicate用於查詢,原理和用法都類似於SQL中的where,作用相當於資料庫的過濾取。

定義(最常用到的方法):

  1. NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...];  
Format:
(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進行過濾 

  1. NSArray *array = [[NSArray alloc]initWithObjects:@"beijing",@"shanghai",@"guangzou",@"wuhan", nil];    
  2. NSString *string = @"ang";    
  3. 相關推薦

    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 響應式布局 響應式布局,簡而言之,就是一個網站能夠兼容多個終端——而不是為每個終端做一個特定的版本。這個概念是為解決移動互聯網瀏覽而誕生的。 響應式布局可以為不同終端

    GITHUB1.5GitHub提供的主要功能

    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【 Objectequals方法四大許可權修飾符】 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

    MySQL5 之 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