web-dev-qa-db-ja.com

Swift)でNSPredicateを使用してCoreDataの結果を並べ替えます

私は現在、Swiftで簡単な電話帳アプリを書いていますが、CoreDataクエリの結果を並べ替える必要があります。

基本的に、「ディレクトリ」と呼ばれるNSManagedObjectを設定し、適切なフィールド名を次のように設定します。 「name_f」はユーザーの名前です。

照会されるCoreDataデータベース内の名前はアルファベット順になっています。ただし、最初の検索では結果がアルファベット順に返されますが、プログラムの他の領域によってデータベースが照会された後では、それ以降の検索が行われない場合があります。これがなぜであるかはわかりませんが、返された配列を任意のフィールドでアクティブに並べ替えるコードを挿入したいと思います。

NSManagedObject配列を返す私のコードは次のとおりです。

func SearchName(nameToSearch: String) -> NSArray {
    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context:NSManagedObjectContext = appDel.managedObjectContext! //I added the !

    let request = NSFetchRequest(entityName: "Directory")
    request.returnsObjectsAsFaults = false      //will return the instance of the object

    //request.predicate = NSPredicate(format: "name_f = %@", nameToSearch)
    //request.predicate = NSPredicate(format: "name_f MATCHES '.*(\(nameToSearch)).*'")
    request.predicate = NSPredicate(format: "name_f MATCHES[cd] '(\(nameToSearch)).*'")
    var results:NSArray = context.executeFetchRequest(request, error: nil)
    return results
}

余談ですが、次のコードを使用して、返された結果から特定の値を取得しています(searchResultはSearchNameが含まれるクラスのインスタンスです)。

    var particularEntry = self.searchResult[self.selectedItem] as Directory
    lblDetailName.text = thisPerson.name_f

理想的には、次のことができるようにしたいと思います。1-上記のコードを変更して、「results」配列が適切にソートされるようにします。 2-結果配列に後で適用して任意のフィールドで再ソートできるコードを特定します。

前もって感謝します!

13
Oliver Spencer

ありがとう-request.predicate行の前に次の行が必要でした:

let sortDescriptor = NSSortDescriptor(key: "name_f", ascending: true)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors
39
Oliver Spencer

ソートアプローチには保留中の変更が含まれているため、Oliver Spencerからの上記の回答を使用しましたが、「最大」アプローチには含まれていません( NSFetchRequestに関するAppleのドキュメント を参照)。

ここに便宜上の私のコードがあります:

func fetch_biggestImageID() -> Int {

    print("Fetching biggest ImageID")
    let request: NSFetchRequest<CD_Image> = CD_Image.fetchRequest()
    request.sortDescriptors = [NSSortDescriptor(key: "id", ascending: false)]
    request.fetchLimit = 1

    var maxValue: Int64? = nil
    do {
        let result = try self.managedObjectContext.fetch(request)
        maxValue = result.first?.id
    } catch {
        fatalError("Unresolved error while retrieving max imageID value \(error)")
    }

    return  Int(truncatingIfNeeded:  maxValue ?? 0 )
}
0
JGS