通过 HTTP 导入核心数据,具有多对多关系
Posted
技术标签:
【中文标题】通过 HTTP 导入核心数据,具有多对多关系【英文标题】:Core Data import over HTTP with to-Many relation 【发布时间】:2011-09-06 05:58:00 【问题描述】:我是核心数据的新手,我有几个问题。我们正在开发一个几乎可以用作企业目录功能的应用程序。因此我有 2 个实体。类别和企业。任何企业都可以有 1 个或多个类别。任何类别都可以有一个父类别。
现在的问题是我们从网络服务获取信息,所以当应用程序第一次运行时,它会从服务器获取信息。
现在,我正在考虑将这些数据导入核心数据的最有效方法。起初我想创建 2 个字典,1 个带有类别,另一个带有业务,然后导入类别,第二个导入业务,但后来我想我必须回去设置两者之间的关系。
然后我考虑只创建一个包含类别的字典和其中的业务字典,但这意味着我们将收到重复的业务信息。
我想要做的是从服务器获取信息,并能够将其导入核心日期及其关系,而不必在这两组信息中循环太多次。因此,欢迎任何有关如何执行此操作的指示。
PS。我们还在创建网络服务,以便信息可以以我们想要的任何方式出现。
感谢您的帮助。
【问题讨论】:
【参考方案1】:我不知道确切的问题出在哪里。 唯一要做的就是创建包含两个实体的 coredata-model:Category 和 Business,它们以一对多的关系链接(您还应该设置反向)
我会通过 Restful-Service 实现同步机制,但您不必这样做。只需在服务器上编写一个脚本,以 xml 或 json 格式提供您需要的数据。然后 iPhone 能够解析该数据并将数据插入 coredata。
xml 示例
<xml>
<business name="alpha">
<category name="cat1" />
<category name="cat2" />
</business>
<business name="beta">
....
</business>
...
</xml>
编辑:
所以只需在解析xml时创建元素(这只是原理):
XmlElement* rootElement = [MyParser parseXmlAndGetDomRootElement:xmlString];
for(XmlElement* businessElement in [rootElement getAllChildrenWithName:@"business"])
Business b = [MyCoreDataHelper createBusiness];
b.name = [businessElement attributeForName: @"name"];
for(XmlElement* categoryElement in [b getAllChildrenWithName:@"category"])
Category c = [MyCoreDataHelper createCategory];
c.name = [c attributeForName:@"name"];
c.business = b; //this will also insert the category to the categories-list of b if you set up your model correctly
[MyCoreDataHelper saveChanges];
所以不需要字典
【讨论】:
我把这部分弄明白了。我已经正确接收和解析数据。我最关心的是如何以最有效的方式将这些具有正确关系的数据导入核心数据。到目前为止,我认为最好的选择是跟踪 NSDictionary 中的每个类别实体并重用它们来建立关系。我只是担心这会花费太多时间/记忆。有意义吗? 我不明白。如果您正确配置了 coredata-model,那么您就不会遇到任何问题来正确获取关系。我只想在我的帖子中订购我的 xml。当我解析一个业务标签时,我会创建一个业务实例并将其存储在一个局部变量中,直到我读取 / 业务标签。如果我读取一个类别标签,我会创建一个类别实例并将该类别的业务属性设置为存储的业务实例。然后 CoreData 也会插入另一个方向。所以你不需要任何字典。我将编辑我的帖子以编写一些伪代码 谢谢,托马斯。我明白你想说什么,这当然有帮助。我担心的是,当我遇到与 categoryX 的第二个业务时,我不想“重新插入”相同的类别。所以我必须查询该类别是否存在,我宁愿避免这种情况。有意义吗? 好的,这在原则上是有道理的。但是就像您在第一段中所说的那样:Any business can have 1 or more categories. Any category can have a parent category.
所以不可能存在属于两个业务的类别。因此,您无需检查该类别或业务是否已经存在。
如果您希望能够先检查,那么您必须首先为每个元素获取数据库:这还不错,因为 CoreData 缓存了对象。或者您将每个元素的主键存储在本地 NSSet
中。以上是关于通过 HTTP 导入核心数据,具有多对多关系的主要内容,如果未能解决你的问题,请参考以下文章