2014-01-25 22 views
1

我有個問題我找不出所以我希望在一些幫助:)NSpredicate「'NSInvalidArgumentException',原因:'在實體<NSSQLEntity Files id = 1>'找不到keypath SELF.SIZE'」

我有一個dore數據庫與文件系統的元數據。我想檢索> 10千字節的文件數,所以我使用了謂詞語句。不幸的是與應用程序崩潰:

'NSInvalidArgumentException' 的,理由是:

這裏的keyPath SELF.SIZE不是在實體發現'代碼:

// Initialize NSFetchrequest and define entity 

NSError *error; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *file = [NSEntityDescription entityForName:@"Files" inManagedObjectContext:appDelegate.managedObjectContext]; 
[request setEntity:file]; 

// Query on Number of files between 0 and 10000 bytes 

NSNumber * tenk = @10000; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"any self.size < %@", tenk]; 
[request setPredicate:predicate]; 
fetchResult = [appDelegate.managedObjectContext executeFetchRequest:request error:&error]; 

int primaBar = fetchResult.count; 
NSLog(@"Files smaller than 10k: %d :",primaBar); 

代碼工作如果不是比較NSnumbers我比較字符串(例如,我能夠檢索具有擴展名「pdf」的謂詞@「any self.extension包含%@」的擴展名)的擴展名),所以我相信我在訪問NSNumber self時做錯了什麼。尺寸。

在此先感謝您的任何提示。

DOM

回答

4

Mistery已解決。

- 從文檔:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html

...一路底部,你可以閱讀:

/*

保留字

下面的話保留:

AND,OR,IN,NOT,ALL,ANY,SOME,NONE,LIKE,CASEINSENSITIVE,CI,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH,BETWEEN,NULL,NIL,SELF,TRUE,YES,FALSE,NO,FIRST,LAST ,SIZE,ANYKEY,SUBQUERY,CAST,TRUEPREDICATE,FALSEPREDICATE

。 */

您可以看到,大小是一個保留的工作,並且這干擾了謂詞的執行。

在結束與'逃避這樣的:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"any self.'size' < %@" , tenk]; 

讓我查詢的工作。

我是IOS編程新手,但這是一個棘手的問題(學習以最困難的方式進行編碼...)。

感謝您的頭腦風暴!

dom

0

嘗試NSPredicate *predicate = [NSPredicate predicateWithFormat:@"size < %@", tenk];

+0

謝謝,但它不起作用 –

2

其實這是語法。

[NSPredicate predicateWithFormat:@"%K < %@", 
     attributeName, attributeValue]; 

所以你可以試試這個。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K < %@",@"\size" ,tenk]; 

我想,這裏size是屬性名稱。

更新:

看到Identifiers概念。我相應地更新了我的答案。

+0

謝謝:它不承認「大小」作爲屬性。試過self.size和file.size ['file'是實體名稱],但仍然無法識別它,所以編譯失敗。 –

+0

@ user3130919您的實體中是否有'size'屬性名稱? – Mani

+0

是的,並不知道大小是一個保留字,因此崩潰 –

1

SELF指的是當前使用的對象。

使用本

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"size < %@", tenk]; 

注意:這隻有當有一個數據庫屬性命名大小存儲每個文件的大小。

+0

謝謝。大小是實體「文件」的屬性之一,所以我們在那裏很好。沒有自我我有這個錯誤:「**由於未捕獲的異常'NSInvalidArgumentException'終止應用程序,原因:'不支持的表達式類型(11,SIZE)'」。這個問題與這樣一個事實有關,即size是一個NSnumber,因爲任何其他具有屬性的查詢都是可以正常工作的(使用self)。不知道NSnumber對謂詞有什麼影響,所以我有點卡住了。 –

+0

SIZE實際上是一個保留字。請參閱[NSPredicate參考。]中的保留字列表(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795 -213522) 除此之外,你應該很好去。 – MjZac

相關問題