【问题标题】:CoreData objects not stying deletedCoreData 对象没有被删除
【发布时间】:2013-09-28 08:46:17
【问题描述】:

我有一个 UItableView,我在其中显示项目列表。您可以选择和取消选择此项目列表。

当用户从表格视图中选择一个项目时,我将该字典添加到我的核心数据中

当用户从 tableview 中取消选择一个项目时,我会从我的 coredata 中删除该字典。

在这方面一切都很好,因为我在每次选择和取消选择时记录 coredata 对象,所以如果我选择了它们,我可以看到有 1 2 或 3 个项目,然后如果我取消选择项目 3,它只记录 1 和2.

所以我知道这些功能运行良好。现在我实现的下一个问题是当 tableview 显示时,我检查我的 coredata 中是否有任何项目,然后当我找到与当前单元格相关的项目时,我添加了一个辅助刻度。这是为了显示您已经将哪些值保存到核心数据中。

现在奇怪的是,之前我从 coredata 中删除了第 3 项,并通过读取 coredata 值并看到仅存在 1 和 2 来确认它。然后重建应用程序以检查并确保该功能正常工作,该功能在视图加载时分配滴答声。一旦视图加载项目 1 2 和 3 都再次被选中.....即使 3 不应该。

我不确定我做错了什么,但这是我在取消选择时调用的核心数据删除函数

// Deleting values/tables from coredata entity
- (void)deleteSingleObject:(NSString *)entityDescription Dictionary:(NSDictionary *)dictionary {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:__managedObjectContext];
    [fetchRequest setEntity:entity];

    NSString *projectIDString = [dictionary objectForKey:@"ProjectID"];
    NSPredicate *p=[NSPredicate predicateWithFormat:@"projectID == %@",projectIDString];
    [fetchRequest setPredicate:p];


    NSError *error;
    NSArray *items = [__managedObjectContext executeFetchRequest:fetchRequest error:&error];

    for (NSManagedObject *product in items) {
        [__managedObjectContext deleteObject:product];
    }

}

这就是我在视图加载时分配刻度的方式

// check if cell needs accessorytick
    for (int i = 0; i < [projectListReadFromCoreDataMutableArray count]; i++) {
        NSDictionary *tempReadCoreDataDictionary = [projectListReadFromCoreDataMutableArray objectAtIndex:i];
        if ([[tempReadCoreDataDictionary objectForKey:@"ProjectID"] isEqualToString:[projectDictionary objectForKey:@"ProjectID"]]) {
            projectListCustomCell.accessoryType = UITableViewCellAccessoryCheckmark;
        }
    }

任何帮助将不胜感激。 如果您需要更多信息或代码,请告诉我,但这是我认为这两个核心部分不起作用的原因。

【问题讨论】:

    标签: ios uitableview core-data


    【解决方案1】:

    您正在从托管对象上下文中删除对象,但您从未将此类修改保存到持久存储中。

    引用documentation

    就像一个新对象在保存上下文之前不会保存到存储中一样,一个已删除的对象在保存上下文之前不会从存储中删除

    这就是为什么当您重新加载应用程序时对象会再次出现的原因。

    您必须将 MOC 保存到持久存储以使删除永久化,即类似

    NSError *error = nil;
    if (![_managedObjectContext save:&error]) {
        // handle error      
    } 
    

    【讨论】:

    • 哦,伙计..这非常有效。我之前在某个地方看过这段代码,但因为我认为它只是为了捕捉错误而忽略了它。哎呀..感谢您的帮助,它运行得很好。时间到了我会接受你的回答:)
    • @HurkNburkS 很高兴你解决了这个问题。无论如何,您应该继续阅读我链接的文档,以便更好地理解 Core Data 的结构。
    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多