2017-08-02 70 views
0

長度在myCoredata實體(人)我想獲取獲取所有的人,通過名稱alphabetically.I的長度排序已經嘗試下面的代碼Coredata與NSSortDescriptor獲取由字母和財產

NSSortDescriptor *nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"first_name" ascending:YES]; 
NSSortDescriptor *lengthSorter = [NSSortDescriptor sortDescriptorWithKey:@「first_name.length" ascending:YES]; 
[fetchRequest setSortDescriptors:@[lengthSorter, nameSortDescriptor]]; 

但是,沒有這是一個完全錯誤的方法?我該如何用CoreData獲取來做這樣的事情?

回答

0

你是對的,它不會工作。用於fetchRequest的謂詞轉換爲mySQL查詢,因此它們不接受任何有效謂詞(如predicateWithBlock:例如)。

在這種情況下,我會建議爲firstNameLength添加在表(財產的實體)的另一列。只有一種方法可以設置名稱並同時設置nameLength屬性(所以它不會失去同步)。然後,您可以簡單地按預先計算的nameLength屬性進行排序。

而且你可能不希望使用NSString.length,因爲它可能並不意味着什麼,你認爲它的意思。帶有裝飾標記的信件(如「簡歷」)可能會有更長的意圖。表情符號也可以是2或4或8個長度的字符串。相反,你可以使用enumerateSubstringsInRange:options:usingBlock:

0

的一種方式做,這是添加屬性使用自定義的getter你的核心數據實體的子類計數組成的字符序列。如果你做了很多核心數據,我建議像mogenerator這樣的東西,或者內置的處理實體生成的函數,這樣你每次改變模型時都不會過度編寫你的模型類。

@property (nonatomic, readonly, getter=getFirstNameLength) NSUInteger firstNameLength; 

-(NSUInteger)getFirstNameLength { 
    return [firstName length]; 
} 

只要這個方法是在.H類公衆,你將能夠訪問它,就像你在你的謂語常規模型屬性。

+0

我想這個代碼出來,我才能夠得到它需要用'NSInMemoryStoreType'工作。當我用'SQLLiteStoreType'試過時,我得到一個異常:'NSInvalidArgumentException',原因:'keypath firstNameLength在實體中找不到。你是否以某種方式獲得這項工作?你可以分享代碼嗎? –

+0

有趣,我沒有使用確切的代碼,但我會看看。 – SpaceTrucker

+0

我正在使用滾動索引的自定義屬性。在表視圖中。我注意到我在自己的計算代碼周圍添加了具有自身willAccessValueForKey和didAccessValueForKey的KVO代碼。我爲什麼你的代碼不能作爲一個SQL商店工作困惑。 – SpaceTrucker