gpt4 book ai didi

ios - 从核心数据中的一对多关系中删除对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:23 32 4
gpt4 key购买 nike

我目前在删除一对多关系中的对象时遇到问题。

我的应用有以下关系:

产品<<- 购物车

当用户在我的 View Controller 中按下“添加到购物车”按钮时,以下代码设置产品对象和购物车之间的关系

    + (Cart *)addProductToCartWithProduct:(Product *)product inManagedObjectContext:(NSManagedObjectContext *)context {

Cart *cart = nil;

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Cart"];

NSError *error = nil;
NSArray *carts = [context executeFetchRequest:request error:&error];

if (!carts || ([carts count] > 1)) {
// handle error
} else if (![carts count]) {
cart = [NSEntityDescription insertNewObjectForEntityForName:@"Cart" inManagedObjectContext:context];


} else { // they already have a cart started
cart = [carts lastObject];
}
/*Get Object ID to safely pass NSMangedObject between threads (A background worker thread and the main thread). */
NSManagedObjectID *retID = [product objectID];
[cart addProductsObject:(Product *)[context objectWithID:retID]];

//Inverse relationship
[(Product *) [context objectWithID:retID] setInCart:cart];


return cart;
}

这然后返回一个购物车对象,我将其传递给我的购物车 View Controller ,并像这样获取该关系中的产品:

             // Fetch request for "Product":
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Product"];

// Fetch only products for the cart:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"inCart = %@", self.cart];
[fetchRequest setPredicate:predicate];


NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"navn" ascending:YES];
[fetchRequest setSortDescriptors:@[sortDescriptor]];

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_theManagedObjectContext sectionNameKeyPath:nil cacheName:nil];
_fetchedResultsController.delegate = self;

然后当我尝试从这样的关系中删除一个对象时:

-(void)RemoveFromCart:(UIButton *)sender {

NSIndexPath *ip = [NSIndexPath indexPathForRow:sender.tag inSection:0];

Product *prod = (Product *)[self.fetchedResultsController objectAtIndexPath:ip];



prod.inCart = nil;
[_cart removeProductsObject:prod];


NSLog(@"Cart %@ %@", _cart.products, prod);


[self saveCurrentContext:_theManagedObjectContext];




[self loadCart];
[_orderTable reloadData];


}

产品在视觉上被移除(从 tableview/screen 中消失)因为 inCart 设置为 nil,但技术上不是......当我记录购物车对象时,产品对象仍在关系中,所以看起来像[_cart removeProductsObject:prod]; 不工作。

反之亦然,当我尝试将相同的产品添加到购物车时,我只是(从购物车中)删除了,出于某种原因,未设置反向关系“inCart”,在我将其设置为“nil”之后,当产品对象被删除时。

为什么会这样?我该如何解决? :).

编辑:

在核心数据模型编辑器中展示反向关系的图片:

enter image description here

enter image description here

将购物车传递给其他 View Controller :

[[[DataManager sharedInstance] backgroundManagedObjectContext] performBlock:^{


UITabBarController *tabBarController = self.tabBarController;

for (UINavigationController *navController in tabBarController.viewControllers) {


for (UIViewController *vc in navController.viewControllers) {
if ([vc isMemberOfClass:NSClassFromString(@"CartViewController")]){
CartViewController *cartVC = (CartViewController *) vc;
cartVC.cart = [Cart addProductToCartWithProduct:prod inManagedObjectContext: [[DataManager sharedInstance] backgroundManagedObjectContext]];

[[DataManager sharedInstance] saveBackgroundContext];
[[DataManager sharedInstance] saveMasterContext];

NSLog(@" %@", cartVC.cart);
}
}

}



}];

保存上下文

-(void)saveCurrentContext:(NSManagedObjectContext *)context  {

NSError *error = nil;
if (![context save:&error]) {
NSLog(@"NOT SAVED");
}
[[DataManager sharedInstance] saveBackgroundContext];
[[DataManager sharedInstance] saveMasterContext];



}

最佳答案

好的,所以我找到了解决这个非常奇怪的问题的方法。由于自动生成的访问器方法由于某种原因不起作用,我不得不想出另一种方法来从关系中删除对象。

          for (Product *prod in _cart.products) {

//To Very reliable to check for item by name attribute, but It works :)
if ([prod.name isEqualToString:product.name]) {

product = prod;

NSMutableSet *set = [NSMutableSet setWithSet:_cart.products];
[set removeObject:prod];
_cart.products = set;


}


}

关于ios - 从核心数据中的一对多关系中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17092153/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com