- 更新日: 2015年8月11日
- Swift & iOS
MR_findAllSortedByでNSPredicateを使いつつソート(Swift/MagicalRecord)
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 を使う方法ではソートの指定ができません。
1 2 |
let profileFilter: NSPredicate = NSPredicate(format: "name BEGINSWITH %@", searchText) profileResults = Profile.MR_findAllWithPredicate(profileFilter) as? [Profile] |
NSPredicate を使いつつソートするには、以下のように、MR_findAllSortedBy の withPredicate: の引数を指定して使うとソートできます。name の ascending 順(昇順)でソートする例。
1 2 |
let profileFilter: NSPredicate = NSPredicate(format: "name BEGINSWITH %@", searchText) sortedProfiles = Profile.MR_findAllSortedBy("name", ascending: true, withPredicate: profileFilter) as? [Profile] |
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 の引数に指定してやれば可能です。
- Swift & iOS の関連記事
- WKWebView/UIWebViewでウェブページが真っ白
- Unityのインストールと初期設定
- WKWebView/UIWebViewでNavigation Barの下にウェブページが隠れるのを回避
- SwiftでArray(配列)などをシャッフル
- Navigation Controllerで画面遷移させるSwiftコード
- Swiftでタップ/スワイプのイベント処理実装・UITapGestureRecognizerとUISwipeGestureRecognizer
- UIPageViewController画面下部のUIPageControlを非表示にする
- Swiftのバージョン確認・REPL実行
- Xcode7.0アップデートで遭遇した課題2つ
- 正規のXcodeかどうかチェック(XcodeGhostマルウェア騒動)
Leave Your Message!