通过desc保存核心数据中的行号和顺序

时间:2017-10-10 13:11:21

标签: swift macos cocoa core-data nstableview

我正在使用swift 4 for macOS,我将核心数据中的数据转换为NSTableview。

现在我想保存数据的顺序。 例如:

MyCoreData1 (Row 1)
MyCoreData2 (Row 2)
MyCoreData3 (Row 3)
MyCoreData4 (Row 4)

现在我按照这样的拖放方式对其进行排序:

MyCoreData1 (Row 3)
MyCoreData2 (Row 2)
MyCoreData3 (Row 1)
MyCoreData4 (Row 4)

如何将此新订单保存到核心数据中? 目前我的实体

中有一个属性“sortNumber”
MyCoreData1 (sortNumber 10)
MyCoreData2 (sortNumber 20)
MyCoreData3 (sortNumber 30)
MyCoreData4 (sortNumber 40)

我将按sortNumber“Desc”对其进行排序 但是如果我重新排序它,我必须构建一个复杂的(我想它将是复杂的)逻辑来将每个元素的sortNumber更改为新的排序顺序。

您有什么想法我能解决这个问题吗?

拖动行的代码

func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool {
        let pasteboard = info.draggingPasteboard()
        let pasteboardData = pasteboard.data(forType: NSPasteboard.PasteboardType.string)

        if let pasteboardData = pasteboardData {

            if let rowIndexes = NSKeyedUnarchiver.unarchiveObject(with: pasteboardData) as? IndexSet {
                var oldIndexOffset = 0
                var newIndexOffset = 0

                for oldIndex in rowIndexes {

                    if oldIndex < row {
                        tableView.moveRow(at: oldIndex + oldIndexOffset, to: row - 1)
                        oldIndexOffset -= 1
                    } else {
                        tableView.moveRow(at: oldIndex, to: row + newIndexOffset)
                        newIndexOffset += 1
                    }
                }
            }
        }

        return true
    }

1 个答案:

答案 0 :(得分:0)

如果您需要保留特定订单,则必须将索引另存为Core Data中的属性。

重新索引记录的逻辑并不复杂。每当订单更改时,根据表视图中的位置更新index属性并保存上下文(例如假设items是数据源数组,NSManagedObject子类具有属性{ {1}}):

index

获取数据时,按func reindex() { for (index, item) in items.enumerated() { item.index = Int32(index) } saveContext() }

对记录进行排序