核心数据直到申请终止后才更新

时间:2009-11-15 00:55:19

标签: iphone objective-c core-data

我遇到核心数据问题......这是我的情况:

我有一个餐厅,那个餐厅有一个类别,这是一个多对多的关系,该类别也有回到餐厅的多对多关系 例如:
麦当劳有以下类别:(类别)快餐,(类别)本地

类别(快餐)
类型:(NSString)快餐)
餐厅:(餐厅)麦当劳,(餐厅)汉堡王等...

所以这很有效。我可以让它显示这些数据,添加到它,删除等。 我遇到的问题:在实际停止并重新启动应用程序之前,我无法显示结果。我似乎无法使用新数据“刷新”我的managedObject。

例如: 目前麦当劳有一个快速良好和本地类别,但在我的应用程序中,我希望用户能够添加另一个类别。因此,用户进入,查看类别列表,然后选择“午餐”类别。 这是我用来执行此操作的代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"EditCatagoriesTableViewController - didSelectRowAtIndexPath section:%d row:%d ",indexPath.section,indexPath.row);

    if ([tableView cellForRowAtIndexPath:indexPath].accessoryType != UITableViewCellAccessoryCheckmark){

        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;  
        [restaurant addCategoriesObject:(Category*)[categoryArray objectAtIndex:indexPath.row]];
    }else{
        if ( [currentCategories  containsObject:[categoryArray objectAtIndex:indexPath.row]] )
            [restaurant removeCategoriesObject:(Category*)[categoryArray objectAtIndex:indexPath.row]];

        }else{
            NSLog(@"Object Not Present");
        }
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;  

    }

    NSError *error = nil;
    if (![ [restaurant managedObjectContext] save:&error]) {
        // Handle error
        NSLog(@"restaurant - Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }       
    if (![ [[categoryArray objectAtIndex:indexPath.row] managedObjectContext] save:&error]) {
        // Handle error
        NSLog(@"restaurant - Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

只有当我关闭我的应用并重新加载它时,这才有效。但是,如果我使用我的餐厅对象(这是麦当劳的托管对象),它会在该应用程序关闭之前显示, 我打开了一个断点,在gdb中已经完成了这个:

(gdb) po restaurant
<Restaurant: 0x114cf80> (entity: Restaurant; id: 0x114b660 <x-coredata://9477D580-A02E-482C-AF7B-F01D6E9AC332/Restaurant/p2> ; data: {
    categories =     (
        0x131f560 <x-coredata://9477D580-A02E-482C-AF7B-F01D6E9AC332/Category/p7>
    );
    city = "Cedar Park";
    deals =     (
    );
    foodTypes =     (
    );
    name = "Mc Donalds";
    phoneNumber = "(512)336-0323";
    state = TX;
    "street_1" = "1103 N Bell Blvd";
    "street_2" = "";
    timeStamp = nil;
    webAddress = "http://www.mcdonalds.com/";
    zip = 78613;
})

如您所见,它将类别显示为一个(在这种情况下,只有一个类别链接到此餐厅)

<Category: 0x132d9c0> (entity: Category; id: 0x132cf80 <x-coredata://9477D580-A02E-482C-AF7B-F01D6E9AC332/Category/p4> ; data: {
    Restaurant =     (
        0x114b660 <x-coredata://9477D580-A02E-482C-AF7B-F01D6E9AC332/Restaurant/p2>
    );
    name = "Weekday Lunch Spot";
})

然而,我的类别(午餐点)显示它有一个指向餐厅麦当劳的指针

那么如何让餐厅更新,以便能看到新物品?

2 个答案:

答案 0 :(得分:1)

几乎总是这是KVO没有观察到变化的结果。您是直接修改对象还是使用KVC方法设置属性?

答案 1 :(得分:0)

我还遇到了核心数据没有更新的同样问题,除非我重新启动应用程序,但经过长时间的努力,我可以通过重置托管对象上下文来解决这个问题

[[self managedObjectContext] reset];