将数据添加到 CoreData

Posted

技术标签:

【中文标题】将数据添加到 CoreData【英文标题】:Adding data into CoreData 【发布时间】:2016-12-19 06:27:20 【问题描述】:

我是 CoreData 的新手,因此我正在寻求一些帮助。

我有两个实体,分别命名为 List(name: String) 和 Items(name: String, quantity: Int)。它们具有一对多的关系,即一个 List 可以有多个 Item。它们背后的逻辑是用户可以使用他的偏好名称创建一个新的 ListName 并向其中添加项目。

我目前有两个表视图控制器,一个用于将项目添加到 Items 实体,另一个用于显示所有 Lists 实体以及该列表包含的任何 Items。

我已经编写了将项目保存到 Items 数组中的代码,但我的问题是如何编写代码来实现关系,以便我可以将 [Items] 保存在其对应的列表中,并且当我加载我的 tableView 中的列表总数我可以查看它们。

例如一个 List(name: Test) 会有 Items(name:sometext, quantity: 1) 等等。

【问题讨论】:

你有没有为此生成类? 是的,我创建了 coredata 实体并生成了它们 cool,你知道coreData中的基本操作吗,比如:1)创建实体。 2)保存 我建议您在ItemsList 上创建反向关系,例如“列表”,然后您可以简单地将项目的列表属性设置为您的List 实例。 CoreData 将为您获取列表及其项目之间的链接 【参考方案1】:

在我们真正讨论您的问题的解决方案之前,我认为您应该解决几个问题。

错误 1:命名约定

核心数据中的关系应该以这样的方式命名,当它们被放置在它们所连接的两个实体的名称之间时,它们就构成了一个完整的句子。它使开发人员(将来要维护的人)的生活变得简单。

因此,与其将list 和listitems 之间的关系命名为listName,这没有多大意义,不如考虑重命名为“Contains”。

列表 -> 包含 -> 列表项。有道理???

错误 2:

从列表到项目仅以一种方式创建关系,而不是从项目到列表创建反向关系,将来有时可能会导致不必要的代码,

例如:假设您在特定列表中显示项目的详细信息,并且出于某种原因您想知道它属于哪个列表,如果您没有反向关系,则必须查询核心数据以找到哪个列表项目属于并稍后获取:)

创建一个反向关系会让您立即访问列表对象。

按照前面提到的约定,items -> belongsTo -> list :)

建议:

仔细查看关系 contains 是一对多,而 belongsTo 是一对一。这意味着一个列表可以包含许多项目,但项目只能属于一个列表:)

根据您的需要修改它:)

让我们回答这个问题:)

let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.managedObjectContext.performAndWait 
        let item1 = NSEntityDescription.insertNewObject(forEntityName: "Item", into: appDelegate.managedObjectContext) as! Item
        item1.name = "abcd"
        item1.quantity = 2

        let item2 = NSEntityDescription.insertNewObject(forEntityName: "Item", into: appDelegate.managedObjectContext) as! Item
        item2.name = "efgh"
        item2.quantity = 5

        let list = NSEntityDescription.insertNewObject(forEntityName: "List", into: appDelegate.managedObjectContext) as! List
        list.name = "Test1"
        list.contains = NSSet(array: [item1,item2])

        //as an alternative you can save the list to item as well :) 
        //both will have same effect

        item1.belongsTo = list
        item2.belongsTo = list

        try! appDelegate.managedObjectContext.save()
    

如上代码所示,

我创建了 item1 和 item2,因为我没有任何列表项,所以我也创建了列表。如果您已经有列表从核心数据中获取并使用它:)

list.contains = NSSet(array: [item1,item2])

上面的语句建立了 item1,item2 和 list 之间的关系:)

注意: : contains 是一个集合,所以如果你只是将它设置为新值,你将失去所有现有的关系,因此你应该将新项目附加到现有的 list.contains 集合中: )

在我的情况下,列表是新鲜的,因此只需将其设置为新值 :)

item1.belongsTo = list
item2.belongsTo = list

上面的语句做同样的工作,在这里你不必担心更新列表的包含属性,它会被核心数据自动更新:)

希望对你有帮助:)

【讨论】:

工作就像一个魅力谢谢!如何获取列表及其项目?我猜它会调用与通常的 fetchRequest 不同的方法? 您可以使用 NSFetchedResultsController。网上教程很多,这里就不写了,写完就写一整篇博客了!!!您始终可以通过说 list.contains 访问列表对象中的项目,并且您可以使用 NSFetchedResultsController 获取所有列表并实现其委托:) 使用 tableView 就像一个魅力:) 尝试阅读它的教程 :) 请考虑接受答案: ) 以上注释并不代表不能使用NSFetchRequest,NSFetchRequest以数组的形式返回数据,在内存中保存一个大数组是非常低效的,而NSFetchedResultsContrller的工作原理是PageFault: ) 除此之外,NSFetchedResultsController 还提供了委托,它为您提供了监控核心数据的能力:) 这意味着如果您在某个后台线程中更新核心数据,您将收到通知并且您的 fetchedResultsController 将更新它的数据与后台线程更新:) 所以你总是更新数据:) 我已经使用 NSFetchedResultsController 来返回包含。它返回一个 NSSet,其中包含该特定列表的数据。我如何将 NSSet 转换为可用于显示数据的东西?

以上是关于将数据添加到 CoreData的主要内容,如果未能解决你的问题,请参考以下文章

无法将项目添加到数据库

将数据添加到 SQLite 数据库

将数据添加到数据库失败且没有错误 - Laravel

如何将 NSDictionary 数据添加到 NSMutableArray?

手动将数据添加到 Java ResultSet

将新行添加到数据表的顶部