Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 删除作为父NSManagedObject集合一部分的NSManagedObject_Ios_Core Data - Fatal编程技术网

Ios 删除作为父NSManagedObject集合一部分的NSManagedObject

Ios 删除作为父NSManagedObject集合一部分的NSManagedObject,ios,core-data,Ios,Core Data,我有一个父NSManagedObject(Person),每个人都可以有报警,这也是一个NSManagedObject。当我转到Person对象的详细视图查看报警时,我希望能够删除报警。我当前要在表中显示的内容: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *SimpleCellIdentif

我有一个父NSManagedObject(Person),每个人都可以有报警,这也是一个NSManagedObject。当我转到Person对象的详细视图查看报警时,我希望能够删除报警。我当前要在表中显示的内容:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *SimpleCellIdentifier = @"SimpleCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleCellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleCellIdentifier];
    }

    NSDate *theDate = [[self sortedTimes] objectAtIndex:indexPath.row];
    cell.textLabel.text = [self.dateFormatter stringFromDate:theDate];

    return cell;
}

- (NSMutableArray *)sortedTimes {
    NSMutableArray *tempArray = [[NSMutableArray alloc] initWithArray:[self.person.alarms allObjects]];     // Alarm NSManagedObject
    tempArray = [tempArray valueForKey:@"time"];                                                            // NSDate value
    return [[NSMutableArray alloc] initWithArray:[tempArray sortedArrayUsingSelector:@selector(compare:)]];
}
所以我想我可以删除最后一个对象,只需执行以下操作:

[[self sortedTimes] removeLastObject];
[self saveContext];

但我相信我被指向的不是实际的报警对象,因为我的分类时间可能不会指向实际的报警集。我想知道在这种情况下我该怎么办?谢谢

您只是被
removeLastObject
的功能弄糊涂了。它是从数组中删除从
sortedItems
返回的对象,而不是对报警对象、上下文或持久性存储做任何操作。我不喜欢这里的设计,但考虑到你所拥有的,你应该能够做到以下几点

Alarm *alarmToDelete = [[self sortedTimes] lastObject];
[myManagedObjectContext deleteObject:alarmToDelete];
[myManagedObjectContext save:&error];

这将从您的上下文中删除报警NSManagedObject,并保存上下文(将其持久化到您的持久存储)。然后,您需要重新加载表格,以便它反映更改。

谢谢您的回答。您有更好的持久存储解决方案吗。我一直在寻找更好的解决方案。要点基本上是一个人有一个闹钟,可以有多个闹钟。所以持久化存储非常简单。人与报警之间只是一对多的关系。与排序后总是返回新数组的
sortedItems
方法不同,我会在
NSFetchRequest
上设置一个排序描述符,用于填充
self.people.alarms
。我指的不是对象图的设计,而是代码本身。希望答案能帮你删除记录?是的,谢谢。我也会试试你推荐的。谢谢我有一个关于NSFetchRequest填充self.people.alarms的问题,你能举个例子吗?我认为self.people.alarms是一个NSSet,使用fetchRequest返回一个数组。因此,对于我的tableView委托和数据源方法,我通常使用NSArray来填充表,我不应该仍然使用数组[self-sortedItems]来填充这些字段吗?如果我错了,请告诉我,因为我只是在学习这些东西。谢谢我想使用
sortedtime
方法可能没什么大不了的。您的另一个选项是使用一个Fetched属性()或为此人在报警实体本身上创建一个新的fetch请求,并在其上设置排序描述符。如果工作顺利的话,我就不会太担心了。可能还有其他更重要的事情需要关注。如果遇到任何性能问题,请思考一下。