防止 Core Data 创建空对象

Posted

技术标签:

【中文标题】防止 Core Data 创建空对象【英文标题】:Prevent Core Data from creating null objects 【发布时间】:2013-02-06 20:04:28 【问题描述】:

这是我用来创建新对象的代码。问题是,如果我选择不保存新对象,它会创建一个空的 tableview 单元格。我怎样才能防止这种情况发生?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([segue.identifier isEqualToString:@"Add"]) 
        NSLog(@"Setting PersonsTVC as a delegate of PersonDetailTVC");
        StepDetailView *personDetailTVC = segue.destinationViewController;
        personDetailTVC.delegate = self;
        personDetailTVC.title = @"Add New Step";
        NSLog(@"Creating a new person and passing it to PersonDetailTVC");
        Step *newPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Step"
                                                        inManagedObjectContext:self.managedObjectContext];

        personDetailTVC.person = newPerson;
    
    else 
        NSLog(@"Unidentified Segue Attempted!");
    

到目前为止我尝试的是在personDetailTVC.person = newPerson;之后插入下面的代码

if (newPerson.name == nil) 
    [self.managedObjectContext deleteObject:newPerson];
    [self.managedObjectContext save:nil];

    [self performFetch];
    [self.tableView reloadData];

但这不是一个好的解决方案,因为它会使应用程序崩溃,因为 tableview 单元格没有被删除,只有对象会。 我认为我可以做的是,如果对象为空,则自动删除第一个 tableview 单元格,但我还没有找到这样做的方法。

有什么建议吗?

【问题讨论】:

抱歉,您能更好地解释一下您的目标吗?我不明白你在这里问什么......谢谢 你应该保存它。如果不需要,您可以稍后将其删除。 【参考方案1】:

我正在猜测我认为这里发生了什么。如果我的假设是错误的,请更正我的任何假设。

你有一个 UITableView 单元格中填充了来自 CoreData 的数据。 您正在通过 NSFetchedResultsController 填充它 转场是 PersonDetailVC,它允许用户为新的托管对象输入数据?

当你'insertNewObjectForEntity:'创建一个新的空白托管对象并将其插入核心数据时,会发生什么。 NSFetchedResultsController 收到更改通知,新单元格被插入 UITableView。 NSFetchedResultsController 接受更改,并添加一个空白单元格。

无论您是否保存上下文,它已经在您的核心数据存储中。 “保存”只是确保更改反映在核心数据的持久存储(sqlite 或 plist)中。 Core Data存在于内存中,sqlite持久化存储只是为了持久化。

解决方案是在用户输入数据之前不要插入核心数据。您不应该在 segue 中插入核心数据。

解决方案: - 在没有创建新对象的情况下转到 PersonDetailVC。 - 用户完成输入数据后,用户按“保存”或“完成” - 当从 PersonDetailVC 弹出时,使用填充的字段将新的 managedObject 插入核心数据。 - NSFetchedResultsController 将接受更改并适当地修改 UITableView。

注意:如果您使用的是 NSFetchedResultsController,则不需要 [self.tableview reloadData]。 fetchedresultscontroller 在合并所有更改后为您调用它。

【讨论】:

以上是关于防止 Core Data 创建空对象的主要内容,如果未能解决你的问题,请参考以下文章

如何防止对象在 Retrofit2 的 API 调用中发送空字段

使用 NSPredicate 遍历多个 Core Data 对象

通过带有 multipart/form-data 的表单发送的文件作为空对象发送

在TypeScript中如何防止属性被添加到一个空对象中?

防止托管对象被 Core Data 再次出错

为啥当状态发生突变时 mapStateToProps 返回空对象?