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という主キーのようなものがあるのを見つけました。これを上手く使えばできるのでしょうか?)