33754


Swif t3でのCoreDataに保存したデータの並び順を保存する方法について教えてください。  
要素にtitleとurl(どちらもString型)を持つbookmarkエンティティがあります。  
これらの各要素をtableviewに表示しています。編集ボタンを押してtableviewを編集したあと、  
その並びをCoreDataに反映させたいのですが、良い方法が浮かびません。現在、下記のコードのように擬似的に並び替えを行なっています。

[code]

    // 並び替え後の処理
    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()
        }
    }
    
[/code]

上のコードのように、一旦CoreDataの中身をからにして、並び替えたデータを再度保存しています。一応これでも動くのですがスマートではありません。データベースのように好きなところにデータをインサートする方法を教えて欲しいです。(CoreDataの中身を見るとz_pkという主キーのようなものがあるのを見つけました。これを上手く使えばできるのでしょうか？)


CC BY-SA 3.0
2017-04-03T12:35:09.823
33750
2017-04-03T17:25:40.183
2017-04-03T16:59:36.440
5519
21189
question
swift ios
CoreDataで並び順を保存したい


一般的なデータベースではオブジェクトの並び順は保存されません。ですので、並び順を示すカラムを追加して、それを用いて並べ替えを行う必要があります。  
CoreDataの場合、結果の並べ替えには`NSSortDiscriptor`を使います。

汎用的な方法としては並び順を示すカラムをモデルに追加し、のタイミング(`tableView(_ tableView: UITableView,
moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath:
IndexPath)`)でそのカラムの値を更新します。

もしくは、例外的にCoreDataはOrderedSetという並び順を保持するデータ型がありますので、関連を作って一段階ラップして利用するのも有効です。そうすると、おそらくより直感的にやりたいことが実現できると思います。


CC BY-SA 3.0
2017-04-03T17:25:40.183
33754
2017-04-03T17:25:40.183
5519
33750
answer