保存包含相同核心数据对象的多个阵列

时间:2018-11-16 17:08:28

标签: ios swift core-data

var done = [Item]()
var list = [Item]()

func loadItems() {
    let request: NSFetchRequest<Item> = Item.fetchRequest()
    do {
        list = try context.fetch(request)
    } catch {
        print("Error fetching data from context: \(error)")
    }
    self.tableView.reloadData()
}

func saveItems() {
    do {
        try context.save()
    } catch {
        print("Error saving context: \(error)")
    }
}

当我将列表中的项目标记为完成时,我试图将其添加到完成列表中并将其从原始列表中删除。但是,saveItems()方法不会将项目保存在完成列表中,并且loadItems方法也不会为完成列表加载项目。

2 个答案:

答案 0 :(得分:2)

  

当我将列表中的项目标记为完成时,我试图将其添加到完成列表中并将其从原始列表中删除。但是,saveItems()方法不会将项目保存在完成列表中,并且loadItems方法也不会为完成列表加载项目。

您可以通过两种方式处理此问题:

  1. done设置Item的属性。然后,您可以保存所有项目而不必担心它们在哪个列表中。您可以通过过滤掉标记为已完成的项目来获取所有项目并创建“待办事项”列表,并通过以下方式创建“完成”列表过滤掉未标记为完成的项目。提取请求可能比“提取所有项目”复杂得多。您可以改为说“获取done为假的所有项目。”

  2. 修复您的代码,以便loadsave方法确实加载并保存两个列表,并且项目的状态继续取决于其位于哪个列表中。核心数据非常善于跟踪对象之间的关系,因此您可以轻松地拥有一个具有donetodo属性的对象,每个属性与Item有一对多的关系,并将项目标记为完成只是将项目从一组移到另一组的问题。

答案 1 :(得分:0)

补充@Caleb的答案,它告诉您如何解决此问题...

发生这种情况的原因是这些数组未保存在Core Data中。它对它们一无所知,因此无法跟踪对象所在的数组。它了解对象,但不了解数组。每次在代码中执行提取操作时,都会将所有项目放入list中。但是它仅存在于内存中,并且永远不会保存到Core Data,因此下次您得到的结果相同。