2014-03-31 31 views
4

我有一個使用NSPredicate返回的行數,其中comments.length> 0的iOS - NSPredicate string.length減結果始終爲0時字符串以算術運算符開始+ - */

問題是一個簡單的方法,我發現當Comment列以+ - *或/開頭時,length屬性總是計算爲0,因此該行從計數中排除。

我在SQLite瀏覽器中打開了表,並驗證該列是一個VARCHAR。使用SQLite查詢來檢查字符串長度是否正常(LENGTH(ZComments)> 0),所以這必須是CoreData問題。

這裏是我的功能...

-(int)getCommentsCount{ 
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
    [request setIncludesSubentities:YES]; 
    [request setEntity:[NSEntityDescription entityForName:@"InspectionRecord" inManagedObjectContext:managedObjectContext]]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(comments.length > 0)"]; 
    [request setPredicate:predicate]; 

    NSError *err; 
    NSUInteger count = [managedObjectContext countForFetchRequest:request error:&err]; 

    //count is ALWAYS 0 if 'comments' starts with + - * or/ WHYYY???  
    return count; 
} 

我能夠通過檢查空/空字符串,而不是使用。長度來解決這個問題,但我真的很想知道爲什麼。長度失敗當字符串以某些字符開頭時。

這是否發生過任何人?

+0

不是你錯誤的原因,但方法簽名應該是' - (NSUInteger)commentsCount'。匹配'-countForFetchRequest:error:'的返回類型,並且不要使用'get'啓動方法名稱,除非它們間接返回多個項目([Cocoa Naming Conventions](https://developer.apple.com/library/mac) /documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282-BCIGIJJF))。 –

回答

7

不能在覈心數據使用Objective-C的功能,如length取請求 (並且當核心數據轉換獲取請求 到一個SQLite查詢「長度」的一部分被簡單地忽略)。但是你可以簡單地用一個空字符串,而不是比較:

[NSPredicate predicateWithFormat:@"comment != ''"] 

對於涉及長度其他疑問,您可以用火柴運營商 正則表達式如下所示:CoreData predicate: string property length?

+1

此外,使用'.length'看起來可能有效的原因是Core Data會將'comments.length> 0'轉換爲SQL,類似't0.ZCOMMENTS> 0',失去了「length」部分查詢。 **這對我來說似乎是一個錯誤,但這就是現在的情況。我不知道SQLite如何在'> 0'比較中評估字符串,但這不是'comments.length'所暗示的。 –

+0

很好的解釋,謝謝!我甚至通過將「.length」改爲「.foo」來驗證這一點,並得到了相同的結果。是否有合法的方法來比較使用NSPredicate的字符串長度? 此外....有人更好地告訴在另一個線程上的人,他們做錯了什麼.... http://stackoverflow.com/questions/7369390/nspredicate-to-test-for-null-and-空白字符串 – iupchris10

+1

@ iupchris10:「comment.length> 0」和類似*可以工作*例如過濾數組。它僅對核心數據提取請求失敗(並且已經在一個評論中提到了答案)。 –