核心数据直到应用程序终止后才会更新

Posted

技术标签:

【中文标题】核心数据直到应用程序终止后才会更新【英文标题】:Core Data not updating until after application terminate 【发布时间】:2009-11-15 00:55:19 【问题描述】:

我在使用 Core Data 时遇到问题...这是我的情况:

我有一家餐厅,该餐厅有一个类别,该类别是一对多关系,并且该类别也与餐厅之间存在一对多关系 例如: 麦当劳有一个类别:(类别)快餐,(类别)本地

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

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

例如: 目前麦当劳有一个 Fast Good 和 Local 类别,但在我的应用程序中,我希望用户能够添加另一个类别。所以用户进去,看到一个类别列表,然后选择类别“午餐”。 这是我用来执行此操作的代码:

- (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];

这仅在我关闭我的应用程序并重新加载它时才有效。但是如果我使用我的餐厅对象(它是麦当劳的 managedObject),它不会显示,直到该应用程序关闭, 我已经打开了一个断点,并在 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";
)

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

那么我该如何让餐厅刷新到可以看到新对象?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我是直接修改,应该改用KVC吗?【参考方案2】:

我也面临同样的问题,除非我重新启动应用程序,否则核心数据不会更新,但经过长时间的努力,我能够通过重置托管对象上下文来解决这个问题

[[self managedObjectContext] reset];

【讨论】:

以上是关于核心数据直到应用程序终止后才会更新的主要内容,如果未能解决你的问题,请参考以下文章

ngOnInit 直到我导航到另一个组件后才会运行

板载 LED,直到我单击重置后才会亮起,数据接收/传输无法正常工作

在 tabBar didSelectItem 上加载核心数据的替代方法?还是加快速度?

在 `cellForRowAt` 中激活 NSLayoutConstraint 直到滚动后才会呈现

APP进入后台后才会释放内存

即使在应用程序终止后也能获得 Apple 的远程推送通知