您好,我想知道是否有人可以帮我解决此核心数据问题。
我目前有两个人,User
和Product
。 User
与Product存在多对多的关系而且没有反向关系(因为我不想知道User
对Product
有什么影响,只有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!
图片链接到关系设置的屏幕截图
添加产品:
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,这似乎打破了核心数据生成类。摆脱这些,一切正常!我现在也得到了倒数。
答案 0 :(得分:4)
我猜,但我不确定,你的模型设置不正确。
是否如下所示?
首先,有一个products
关系(对许多人而言)删除规则已设置为cascade
。此外,还有一个反向(user
)已设置为nullify
。从图形上看,它们将如下所示。
对于User
实体,products
关系已设置为
对于Product
实体,user
关系已设置为
关于可选标志,您需要根据需要做出决定。
即使您不想要反向,也强烈建议对其进行设置,以便让Core Data保持图表的一致性。
然后,当您删除对象时,您应该运行save
(也传递NSError
)以便将更改保留到磁盘上。
关于Sqlite商店,我的如下:
ZUSER表
ZPRODUCT表
答案 1 :(得分:2)
我有同样的问题,并添加逆关系修复它。没有其他事情需要做。