MagicalRecord の MR_findAllWithPredicate で SQL でいう LIKE 検索のようなことをやっていて、検索結果をソートした状態で取得したかったのですけど、上手く行きませんでした。MR_findAllWithPredicate の代わりに MR_findAllSortedBy を使ったら上手く動作した。MR_findAllWithPredicate による LIKE 検索については以下エントリー参照。

SwiftとMagicalRecord/CoreDataでLIKE検索 | EasyRamble

— 環境 —
Xcode 6.3.2
Swift 1.2


検索したところ、同じ問題に遭遇した方の GitHub issue を見つけました。

@Spokane-Dude is right — predicates imply no order. You need to sort the results after you get them, or use the method mentioned:

NSArray *awesomeObjectsArray = [AwesomeObject MR_findAllSortedBy:@”awesomeString” ascending:YES withPredicate:predicate inContext:localContext];

MR_findAllSortedBy で withPredicate: を指定してソート

例として、searchText の文字列で始まる name を検索する。

以下の書き方 MR_findAllWithPredicate を使う方法ではソートの指定ができません。

NSPredicate を使いつつソートするには、以下のように、MR_findAllSortedBy の withPredicate: の引数を指定して使うとソートできます。name の ascending 順(昇順)でソートする例。

MagicalRecord の GitHub の README で、MR_findAllSortedBy を使うコードを見つけました。Objective-C の例ですがこれも参考になった。

// To return the same entities sorted by a specific attribute:
NSArray *peopleSorted = [Person MR_findAllSortedBy:@”LastName” ascending:YES];

//To return the entities sorted by multiple attributes:
NSArray *peopleSorted = [Person MR_findAllSortedBy:@”LastName,FirstName” ascending:YES];

// To return the results sorted by multiple attributes with different values.
// If you don’t provide a value for any attribute, it will default to whatever you’ve set in your model:
NSArray *peopleSorted = [Person MR_findAllSortedBy:@”LastName:NO,FirstName” ascending:YES];
// OR
NSArray *peopleSorted = [Person MR_findAllSortedBy:@”LastName,FirstName:YES” ascending:NO];

以上 Swift & MagicalRecord な環境で、SQL の LIKE 検索のようなことを行いつつソートした検索結果を得るには、MR_findAllSortedBy を使って NSPredicate オブジェクトを withPredicate の引数に指定してやれば可能です。


Leave Your Message!