我已经搜遍了,但仍然没有找到任何非常有效的方法。问题/答案太老了,或者根本不适合我。这是我第一次尝试“我自己的”应用程序。由于这似乎是一种通行权,我正在制作一个清单应用程序。这就是我要找的东西:
我的数据存储包含 4 个属性:(name, category, isChecked, isActive
随着我的扩展,肯定会有更多属性)
当我的视图控制器最初加载时,它NSFetchedResultsController
有一个NSPredicate
只检索属性isActive
为 YES (或[NSNumber numberWithBool:YES
)的记录。然后它获取这些记录并将它们显示到用户的适当单元格中。当用户单击单元格时,Data Store 会isChecked
相应地更新和更改属性。到目前为止,一切都很好。
我现在需要做的是能够从列表中删除项目(1 个或多个)。具体来说,我需要它来更新数据存储属性isChecked
,并且isActive
只有当它的当前isChecked
属性为 YES 时才更新为 NO。(我不打算从数据存储中删除记录,因为它们将用于构建数据库以供用户将来使用。)
除其他外,我使用过:
[[[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)