CoreDataで並び順を保存したい
Swif t3でのCoreDataに保存したデータの並び順を保存する方法について教えてください。
要素にtitleとurl(どちらもString型)を持つbookmarkエンティティがあります。
これらの各要素をtableviewに表示しています。編集ボタンを押してtableviewを編集したあと、
その並びをCoreDataに反映させたいのですが、良い方法が浮かびません。現在、下記のコードのように擬似的に並び替えを行なっています。
// 並び替え後の処理
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
// bookmarkListにはCoreDataから読み込んだデータが格納されている
let moveData = bookmarkList[sourceIndexPath.row] // 移動先のデータを格納
bookmarkList.remove(at: sourceIndexPath.row) //元の位置のデータを配列から削除する。
bookmarkList.insert(moveData, at:destinationIndexPath.row) //移動先の位置にデータを配列に挿入する。
deleteBookmark() // 一旦CoreDataの中身を全て削除
for bookmark in bookmarkList { // 再度並び替え後のデータを保存
addBookmark(aTitle: bookmark.Title!, aUrl: bookmark.Url!)
}
}
// CoreDataからの削除関数
func deleteBookmark() {
let query: NSFetchRequest<MyBookmark> = MyBookmark.fetchRequest()
do {
let fetchResults = try context.fetch(query)
for result: AnyObject in fetchResults {
let record = result as! NSManagedObject
context.delete(record)
}
try context.save()
} catch {
}
}
// CoreData新規登録関数
func addBookmark(aTitle: String, aUrl: String) {
let mybookmark = MyBookmark(context: context)
// 既に登録されているものは登録されないようにURLで検索する。
let fetchRequest:NSFetchRequest<MyBookmark> = MyBookmark.fetchRequest()
let predicate = NSPredicate(format:"%K = %@","Url","\(aUrl)")
fetchRequest.predicate = predicate
let fetchData = try! context.fetch(fetchRequest)
if fetchData.isEmpty {
// 新しく登録する
if aTitle != "" && aUrl != "" {
mybookmark.Title = aTitle
mybookmark.Url = aUrl
}
do{
try context.save()
}catch{
}
}else{
context.reset()
}
}
上のコードのように、一旦CoreDataの中身をからにして、並び替えたデータを再度保存しています。一応これでも動くのですがスマートではありません。データベースのように好きなところにデータをインサートする方法を教えて欲しいです。(CoreDataの中身を見るとz_pkという主キーのようなものがあるのを見つけました。これを上手く使えばできるのでしょうか?)