首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >核心数据不一致-- fetch有时什么也不返回。

核心数据不一致-- fetch有时什么也不返回。
EN

Stack Overflow用户
提问于 2013-04-12 10:33:01
回答 1查看 1.7K关注 0票数 6

我已经花了几个小时在这个问题上,我似乎找不到解决办法。首先,关于我有哪些方面的一些规范:

  • 带有核心数据的C iOS 6应用程序
  • 核心数据是从具有自动保存功能的UIManagedDocument中初始化的。
  • 来自ManagedContext的UIManagedDocument存储在一个静态变量中,并在整个应用程序中重用。
  • 这个应用程序使用RestKit,我使用它提供的ActiveRecord类别。

我有一个团队实体的模型。在应用程序中,有一个teams视图控制器,它从后端加载团队。后端返回JSON数组,其中包含team ID。我将该ID存储在模型中的" ID“字段中,在迭代服务器响应时,我查找给定ID的团队是否已经存在。如果是这样的话,我只更新它的信息,并传递对象,如果没有-我首先创建它。

这就是它变得奇怪的地方。这在90%的时间里起作用。我可以加载Team控制器,在应用程序中更进一步,回到控制器(再次加载数据),大多数情况下一切都很好。然而,偶尔,我的fetch请求将不会返回任何内容。如:

代码语言:javascript
运行
复制
NSArray *results = [context executeFetchRequest:request error:&error];

将返回空数组,而错误也为空。服务器上的任何东西都不会改变。当我尝试调试它时,请求如下:

代码语言:javascript
运行
复制
<NSFetchRequest: 0x127a0e20> (entity: Team; predicate: (id == "123"); sortDescriptors: ((null)); limit: 1; type: NSManagedObjectResultType; )

当我在外部应用程序中预览sqlite存储时,我可以看到这个ID的团队项目是存在的,在其他90%的时间里,它确实会被加载。更奇怪的是,当我打开SQLDebug时,我可以看到:

代码语言:javascript
运行
复制
2013-04-12 12:00:27.934 SportLink[10831:c07] CoreData: annotation: fetch using
NSSQLiteStatement <0x12656d10> on entity 'Team' with sql text 'SELECT 0, t0.Z_PK,
t0.Z_OPT, t0.ZACI1, t0.ZACI2, t0.ZACI3, t0.ZALTFIRSTNAME, t0.ZALTSECONDNAME, t0.ZCOLOR1,
t0.ZCOLOR2, t0.ZGENDER, t0.ZICON, t0.ZID, t0.ZLOCATION, t0.ZLOGO1, t0.ZLOGO2, t0.ZNAME,
t0.ZTYPE, t0.ZSPORT FROM ZTEAM t0 WHERE  t0.ZID = ?  LIMIT 133' returned 6 rows

这意味着备份存储实际上获取了数据,但由于某种原因并没有传递数据。现在:

  • 我正在做所有的事情,所以这不是一个问题
  • 我相信自动保存也不是一个问题,因为即使当我关闭应用程序,用已经存在的数据再次打开它时,也会发生这种情况。

对这里到底发生了什么有什么想法吗?

编辑:我用仪器分析了这个应用程序。我刚输入了有问题的VC,然后输入它的子控制器并离开,重复了几次,直到问题开始显现出来。以下是结果。也许从这里可以更容易地知道发生了什么:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-15 11:14:59

经过几天的调查,我终于找到了这个错误的原因。获取团队实体的代码如下所示:

代码语言:javascript
运行
复制
Team *team = [Team findFirstByAttribute:WSK_ID withValue:data[WSK_ID] inContext:moc];

WSK_ID只是@"id"的一个定义。data是我从RestKit获得的一个字典,它来自JSON响应。因为它没有被转换成任何类型,所以它可能是一个NSString,而Team实体的id属性需要NSNumber。虽然我不知道它有时只失败了什么,但是将这个部分更改为:

代码语言:javascript
运行
复制
Team *team = [Team findFirstByAttribute:WSK_ID withValue:@([data[WSK_ID] intValue]) inContext:moc];

也就是说,将ID字符串转换为int,然后用NSNumber对其进行装箱,解决了问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15969079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档