私は現在、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-結果配列に後で適用して任意のフィールドで再ソートできるコードを特定します。
前もって感謝します!
ありがとう-request.predicate行の前に次の行が必要でした:
let sortDescriptor = NSSortDescriptor(key: "name_f", ascending: true)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors
ソートアプローチには保留中の変更が含まれているため、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 )
}