5

我的问题很奇怪,我正在寻求帮助。我想向你解释我的系统是如何工作的。我有两个问题。

我正在制作有两张桌子的应用程序。我正在使用核心数据。表是CategoryProducts,在核心数据中我建立了一对多关系Category可以有多个ProductsProduct可以hove一个Categroy

这是基本架构

Category {
  site_id
  name
  allProducts ->> Product
}

Product {
  site_id
  name
  category -> Category
}
  • 这是简化的模型产品,catwegories 有更多的属性

在该应用程序中,我有更新过程,并且该过程在后台线程中工作。我已经为该线程创建了上下文以及我在该上下文中存储的所有更改。

我在后台线程中执行的所有计算

[context performBlock:^{
  // all my operations for updating storing categories and products
}]

这是更新过程的流程

  1. 从服务器获取带有类别数据的 JSON
  2. 从服务器获取带有产品数据的 JSON
  3. 从服务器获取带有信息的 JSON 哪个类别有哪些产品array((category_site_id > array(product_site_id1, product_site_id2...))

  4. 通过类别 JSON 和存储类别实体,我从 JSON 获取名称和 site_id 并创建实体并设置这些属性

  5. 传递产品 JSON 并创建产品实体并从 JSON 的属性中设置名称和 store_id

然后是主要部分

  1. 现在我需要根据在步骤 3 中获得的 JSON 将产品连接到类别,这是一个问题。

我将从 JSON foreach 类别获取所有产品 site_id 作为 NSArray,我使用带有谓词和 IN 标准的 fetch 请求从具有 site_id IN 数组的上下文中获取所有产品实体。但我总是得到零结果。这很奇怪,因为我在后台线程的上下文中调用 fetch results,并且我还在第 3 步和第 4 步中更新了该上下文。

然后我尝试下一件事,在第 6 步之前,我[context save:&error]添加了大约 30 秒的睡眠时间,当该程序运行到第 6 步之后,所有的工作都非常有趣,我的 fetch 结果获得了带有 IN 标准的谓词的产品。如果您理解我的话,这是我的第一个问题,我无法通过 ID 获取产品我需要等待大约 30 秒才能将上下文存储到 SQLLiteDB,这很奇怪。这也很奇怪,因为当我想通过 id 获取请求获取类别时,我可以毫无问题地获得它(可能是因为第 5 步大约需要一分钟)。

我的下一个问题是当我等待 30 秒然后通过 trought 类别时。基于类别 site_id 我从上下文中获取类别实体,并且在第 6 步中,我根据 JSON 获取的产品 site_id 获取所有产品并获取请求,现在我想将产品添加到类别中,然后我调用 next

[category setAllProducts:results] //结果是产品的NSSet,类别是实体对象

NSError *error = nil; [上下文保存:&错误];

我做那个foreach categroy(在步骤3中从服务器以JSON格式获取)

完成后,我在 UI 上看不到类别中的产品,我也在等待一段时间将所有数据存储在数据库中,但什么也没有,

然后当我停止应用程序并再次运行它时,我可以看到类别中的产品:(

很奇怪的问题请帮帮我我不知道我哪里错了。我可以发布部分代码,代码不小,我根据过程描述寻求帮助。

非常感谢你

4

1 回答 1

13

我的理解是您正在使用子上下文。子上下文受到您必须处理的许多(许多! )错误的影响。

关于该主题的相当不错的文章在这里:

http://wbyoung.tumblr.com/post/27851725562/core-data-growth-pains

我对此的建议是使用直接连接到商店协调器的上下文,而不是子上下文。使用这样的设置一切都会正常工作。当然,您可以使用私有队列上下文。

于 2012-08-10T11:12:45.627 回答