【发布时间】:2013-02-15 08:29:02
【问题描述】:
我已经搜索过,但仍然没有找到任何非常有效的方法。问题/答案太老了,或者根本不适合我。这是我第一次尝试“我自己的”应用程序。由于这似乎是一种通行权,我正在制作一个清单应用程序。这就是我要找的东西:
我的数据存储包含 4 个属性:name, category, isChecked, isActive(随着我的扩展,肯定会有更多属性)
当我的视图控制器最初加载时,NSFetchedResultsController 有一个NSPredicate,它只检索属性isActive 为YES(或[NSNumber numberWithBool:YES)的记录。然后它获取这些记录并将它们显示到用户的适当单元格中。当用户单击单元格时,Data Store 会相应地更新并更改 isChecked 属性。到目前为止一切正常。
我现在需要做的是能够从列表中删除项目(1 个或更多)。具体来说,我需要它将数据存储属性isChecked 和isActive 更新为NO,前提是它的当前isChecked 属性为YES。 (我不打算从数据存储中删除记录,因为它们将用于构建数据库以供用户将来使用。)
我用过,除其他外:
[[[self fetchedResultsController] fetchedObjects]
setValue:[NSNumber numberWithBool:NO]
forKey:@"isChecked"];
这确实有效,它会删除复选标记并相应地更新商店。问题是,我不仅对isActive 项目的数据存储发出另一个请求,它还搜索获取的整个“活动列表”并将它们的每个isChecked 属性设置为NO。对于小型列表来说,这可能不是什么大问题,但随着列表的扩展,这可能是个问题。
另一个问题是,如果我添加:
[[[self fetchedResultsController] fetchedObjects]
setValue:[NSNumber numberWithBool:NO]
forKey:@"isActive"];
它将我的所有列表项设置为 NO(以及同一方法中的第二个数据存储请求。)
所以我的问题是:我如何才能通过列表,仅查找已检查的项目并仅更新那些isChecked 属性为 YES 的记录(设置 isChecked && isActive 属性 = NO)而不是通过整个列表?
我已经尝试为这个按钮操作专门创建一个单独的 fetchedResultsController,它确实有效(也就是说,它没有崩溃)但是调试器弹出了一个相当大的“严重应用程序错误”。我不会发布错误消息,因为它很长并且很可能与任何解决方案无关。
任何帮助将不胜感激。在此先感谢,请保持温柔:-]。
编辑
我尝试使用 for 循环 for (NSString *item in fetchedResultsController) 但我收到错误 ...may not respond to 'countByEnumeratingWithState:objects:count'
这里似乎需要某种循环,但同样,我找不到任何相关或过时的东西。再次感谢您的帮助。
编辑 2
这是我在为此按钮/方法运行第二个单独的 fetchRequestController 时遇到的原始错误:
An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (4) must be equal to the number of rows contained in that section before the update (4), plus or minus the number of rows inserted or deleted from that section (0 inserted, 3 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)
【问题讨论】:
-
您应该尝试使用
NSBatchUpdateRequest。看看我的回答stackoverflow.com/a/66635329/1703291
标签: iphone xcode sqlite ios6 xcode4.5