核心数据从多对集中删除对象而不保存

时间:2015-02-18 20:30:40

标签: ios objective-c core-data

您好,我想知道是否有人可以帮我解决此核心数据问题。

我目前有两个人,UserProductUser与Product存在多对多的关系而且没有反向关系(因为我不想知道UserProduct有什么影响,只有Product sa User有。使用Xcode为我生成的子类中的addProductsObject方法,向用户添加产品可以正常工作。问题是当我尝试从{{1}中删除Product对象时使用User看起来很好。上传在AppDelegate的removeProductsObject上关闭。但是如果我在Xcode中运行我的应用程序或者杀死应用程序并再次启动它,那么这种关系仍然存在它没有被删除!

Objective-C,iOS 8 Simulator,Xcode 6.1.1

任何人都有任何想法?

更新:Zip Project here if anyone would like to take a look!

图片链接到关系设置的屏幕截图

enter image description here

添加产品:

applicationDidEnterBackground

删除产品:

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
  [user addProductsObject:[self.products objectAtIndex:indexPath.row]];
  [self.navigationController popViewControllerAnimated:YES];
}

SQL日志:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [user removeProductsObject:[self.products objectAtIndex:indexPath.row]];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

运行2015-02-18 22:41:17.635 Project[22802:1254740] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDOB, t0.ZEMAIL, t0.ZFIRSTNAME, t0.ZLASTNAME, t0.ZLOCATION, t0.ZPASSWORD, t0.ZUSERNAME FROM ZUSER t0 WHERE t0.ZUSERNAME = ? 2015-02-18 22:41:17.635 Project[22802:1254740] CoreData: annotation: sql connection fetch time: 0.0003s 2015-02-18 22:41:17.635 Project[22802:1254740] CoreData: annotation: total fetch execution time: 0.0005s for 1 rows. 2015-02-18 22:41:18.958 Project[22802:1254740] CoreData: sql: SELECT 0, t0.Z_PK FROM ZPRODUCT t0 WHERE t0.Z6PRODUCTS = ? 2015-02-18 22:41:18.959 Project[22802:1254740] CoreData: annotation: sql connection fetch time: 0.0002s 2015-02-18 22:41:18.959 Project[22802:1254740] CoreData: annotation: total fetch execution time: 0.0004s for 2 rows. 2015-02-18 22:41:18.959 Project[22802:1254740] CoreData: annotation: to-many relationship fault "products" for objectID 0xd000000000040000 <x-coredata://1C19A10A-BD0E-480B-B4A2-F6BBB26D9F74/User/p1> fulfilled from database. Got 2 rows 2015-02-18 22:41:18.963 Project[22802:1254740] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZBARCODE, t0.ZCALORIES, t0.ZCARBOHYDRATES, t0.ZDESC, t0.ZFAT, t0.ZFIBRE, t0.ZNAME, t0.ZPROTEIN, t0.ZSALT, t0.Z6PRODUCTS FROM ZPRODUCT t0 WHERE t0.Z_PK = ? 2015-02-18 22:41:18.963 Project[22802:1254740] CoreData: annotation: sql connection fetch time: 0.0002s 2015-02-18 22:41:18.963 Project[22802:1254740] CoreData: annotation: total fetch execution time: 0.0005s for 1 rows. 2015-02-18 22:41:18.964 Project[22802:1254740] CoreData: annotation: fault fulfilled from database for : 0xd0000000000c0002 <x-coredata://1C19A10A-BD0E-480B-B4A2-F6BBB26D9F74/Product/p3> 2015-02-18 22:41:18.965 Project[22802:1254740] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZBARCODE, t0.ZCALORIES, t0.ZCARBOHYDRATES, t0.ZDESC, t0.ZFAT, t0.ZFIBRE, t0.ZNAME, t0.ZPROTEIN, t0.ZSALT, t0.Z6PRODUCTS FROM ZPRODUCT t0 WHERE t0.Z_PK = ? 2015-02-18 22:41:18.965 Project[22802:1254740] CoreData: annotation: sql connection fetch time: 0.0002s 2015-02-18 22:41:18.965 Project[22802:1254740] CoreData: annotation: total fetch execution time: 0.0003s for 1 rows. 2015-02-18 22:41:18.965 Project[22802:1254740] CoreData: annotation: fault fulfilled from database for : 0xd000000000100002 <x-coredata://1C19A10A-BD0E-480B-B4A2-F6BBB26D9F74/Product/p4> 生成这些日志,很奇怪为什么没有更新。同样为什么[managedObjectContext save:]有一个名为Product的字段。我打开了SQL数据库,在实体products中有一个叫做Products的int。

ANSWERED 问题是我为Core Data Object编写了一些自己的方法getter,这似乎打破了核心数据生成类。摆脱这些,一切正常!我现在也得到了倒数。

2 个答案:

答案 0 :(得分:4)

我猜,但我不确定,你的模型设置不正确。

是否如下所示?

enter image description here

首先,有一个products关系(对许多人而言)删除规则已设置为cascade。此外,还有一个反向(user)已设置为nullify。从图形上看,它们将如下所示。

对于User实体,products关系已设置为

enter image description here

对于Product实体,user关系已设置为

enter image description here

关于可选标志,您需要根据需要做出决定。

即使您不想要反向,也强烈建议对其进行设置,以便让Core Data保持图表的一致性。

然后,当您删除对象时,您应该运行save(也传递NSError)以便将更改保留到磁盘上。

关于Sqlite商店,我的如下:

ZUSER表

enter image description here

ZPRODUCT表

enter image description here

答案 1 :(得分:2)

我有同样的问题,并添加逆关系修复它。没有其他事情需要做。