Realmをデータソースにしてテーブルビューの並べ替えをしたい
RealmにてPrimaryキーを書き換えようとしています。
それによってTableViewの並べ替えをしたいと考えております。
しかし以下のコードではプライマリーキーのIDを書き換える時にエラーが出ます。
Terminating app due to uncaught exception 'RLMException', reason: 'Primary key can't be changed after an object is inserted.'
エラーメッセージと公式サイトの情報から推察すると、プライマリーキーは変更できないという理解でよろしいでしょうか?
できないとすると、一般的には一度すべてのデータ(多くても数十件のデータを想定)を避難して、DBをすべて削除し採番し直して追加ということで対処するのがいいのでしょうか。
もしくは、テーブルに表示順を持たせて、それを書き換えるのがいいのでしょうか。
ご教授いただけないでしょうか。
よろしくお願いいたします。
※以下のコードは、間違いがあるかもしれませんので、したいことを理解する目的で参考にしていただければと思います。
//メインデータ
class mainDataTable: Object {
dynamic var ID = Int()
let Days = List<subDataTable>() //LinkingObjects(fromType: subDataTable.self, property: "Day") //
dynamic var CategoryNo = Int()
override static func primaryKey() -> String? {
return "ID"
}
}
let realm = try! Realm()
let results = try! Realm().objects(mainDataTable.self).sorted(byKeyPath: "ID")
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
//元の位置のデータを控える
let targetTitle = results[sourceIndexPath.row]
//編集開始
realm.beginWrite()
//Key(ID)が重複しないように元のデータの削除
realm.delete(results[sourceIndexPath.row])
//リナンバー
if sourceIndexPath.row < destinationIndexPath.row {
for i in sourceIndexPath.row..<destinationIndexPath.row {
let target = results[i]
target.ID = i + 1 //ここでエラー
realm.add(target, update: true)
}
} else {
for i in destinationIndexPath.row..<sourceIndexPath.row {
let target = results[i]
target.ID = i - 1 //ここでエラー
realm.add(target, update: true)
}
}
//移動後のナンバーに変更して追加する
targetTitle.ID = destinationIndexPath.row + 1
realm.add(targetTitle, update: true)
//確定
try! realm.commitWrite()
}