我已经搜寻过,但仍然找不到任何有效的方法。这个问题/答案太旧了,或者对我没有用。这是我首次尝试使用“我自己的”应用程序。似乎是通过的权利,我正在制作清单应用程序。这是我要找的东西:

我的数据存储包含4个属性:name, category, isChecked, isActive(随着我的扩展,肯定会有更多属性)

最初加载View Controller时,NSFetchedResultsController具有一个NSPredicate,该isActive仅检索属性[NSNumber numberWithBool:YES为YES(或isChecked)的记录。然后,它将获取这些记录,并将它们显示给用户相应的单元格。用户单击单元格时,数据存储将相应地更新和更改isChecked属性。至此一切正常。

我现在需要做的是能够从列表中删除项目(1个或更多)。具体来说,仅当当前isActive属性为YES时,我才需要将其将数据存储属性isCheckedisActive更新为NO。 (我不想从数据存储中删除记录,因为它们将用于建立数据库以供用户将来使用。)

除其他外,我用过:

[[[self fetchedResultsController] fetchedObjects]
   setValue:[NSNumber numberWithBool:NO]
   forKey:@"isChecked"];


这确实有效,它会删除选中标记并相应地更新商店。问题是,不仅我要向数据存储请求另一个isChecked项,而且还会搜索整个获取的“活动列表”,并将每个isChecked属性设置为NO。对于小的列表来说,这可能不是太大的问题,但是随着列表的扩展,这可能是一个问题。

另一个问题是,如果我添加:

[[[self fetchedResultsController] fetchedObjects]
   setValue:[NSNumber numberWithBool:NO]
   forKey:@"isActive"];


它将所有我的列表项设置为NO(以及同一方法中的第二个数据存储请求)。

所以我的问题是:如何浏览列表,仅查找已检查的项目并仅更新其for属性为YES的记录(设置isChecked && isActive属性均为NO),而不是整个列表?

我尝试专门为此按钮操作创建一个单独的fetchedResultsController,它确实起作用了(也就是说,它没有崩溃),但是调试器弹出了一个相当大的“严重应用程序错误”。我不会发布错误消息,因为它的时间很长,而且很可能与任何解决方案都无关。

任何帮助将不胜感激。在此先感谢您,请保持谦虚:-]。

编辑

我尝试使用for (NSString *item in fetchedResultsController)循环...may not respond to 'countByEnumeratingWithState:objects:count',但收到错误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)

似乎这里需要一个循环,但同样,我找不到任何相关的内容或已过时。再次感谢您的协助。

编辑2

这是我为该按钮/方法运行另一个单独的fetchRequestController时遇到的原始错误:

最佳答案

您可以仅遍历fetchedObjects集合并更改托管对象。更改它们之后,您需要重新加载列表(我想您使用的是表格视图)。

我不知道您的类的名称,但是一般来说,您可以循环遍历托管对象的集合并进行更改。请记住,如果要在应用程序关闭时保留这些更改,则需要保存托管对象上下文。

NSArray* myCollection = [[self fetchedResultsController] fetchedObjects];
for(ActiveListData *managedObject in myCollection)
{
    if(managedObject != nil && managedObject.isChecked)
    {
        managedObject.isChecked = NO;
        managedObject.isActive = NO;
    }
}


如果要对数据库中的所有对象进行检查,则需要在NSFetchedResultsController中使用一个新方法,该方法对isChecked进行谓词检查,然后循环并编辑结果集合。

您可能需要发布错误代码,因为我们可以指出您做错了什么。

编辑:如果您不熟悉使用Core Data,Apple文档将提供很多信息:http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/CoreData/Articles/cdBasics.html

09-26 15:40
查看更多