被删除的实体再次被findFirstByAttribute在MagicalRecord中找到

问题描述:

我正在实现使用MagicalRecord和CoreData Wrapper的应用程序中的收藏场景。我正在寻找的价值,如果在我的实体中找到该属性,它会删除它作为最喜欢的,否则它会将它添加到最喜欢的。在这里做DX *foundDX = [DX MR_findFirstByAttribute:@"code" withValue:cell.DXCodeName.text]; foundDX是我正在检查的值。
我有一个UISearchBar添加到我的tableView。所以当视图被加载的时候,它会显示已经使用过的最不喜欢的项目。如果用户搜索并选择一个项目,它会成功将它添加到fav并成功从数据模型中删除它。但如果我再次点击收藏按钮,它会崩溃。被删除的实体再次被findFirstByAttribute在MagicalRecord中找到

if (!foundDX.code) { 
     //If we are always getting into here that means that either foundDX is nil 
     //or the code is nil so you need to verify the logic around that. 
     if (indexPath != nil) 
     { 
      if (!_AddEditDX) { 
       self.AddEditDX = [DX MR_createEntity]; 
      } 
      [self.AddEditDX setCode:cell.DXCodeName.text]; 
      [self.AddEditDX setDescriptions:cell.DXDescText.text]; 
      [self.AddEditDX setIsFav:[NSNumber numberWithInt:1]]; 

      [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 
      [self.favDXArray addObject:self.AddEditDX]; 
      [self fetchFavDX]; 

      [cell.DXFavButton setImage:[UIImage imageNamed:@"star_filled"] forState:UIControlStateNormal]; 
      [KSToastView ks_showToast:@"Added to Favourite" duration:1.0f]; 

     } 
    } else if(self.favDXArray.count > indexPath.row) { 
     //You can get rid of the if(foundDX.code) because this is the else block to not having it so we must have it. 
     //Only thing to worry about is the array size 
     NSLog(@"count is: %ld and row is: %ld",_favDXArray.count, (long)indexPath.row); 
     DX *tempDX = [self.favDXArray objectAtIndex:indexPath.row]; 
     [tempDX MR_deleteEntity]; 

     [cell.DXFavButton setImage:[UIImage imageNamed:@"star_blank"] forState:UIControlStateNormal]; 
     [self.favDXArray removeObjectAtIndex:indexPath.row]; 
     [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 
     [KSToastView ks_showToast:@"Removed from Favourite" duration:1.0f]; 
    } 

通过应用一些断点我发现:
假设代码是E45foundDX没有发现它的第一次,并把它添加到数据模型。然后再次按下fav按钮将其删除,实际上删除它。但如果我再次点击收藏按钮,foundDX仍然E45,因此它崩溃。但是,如果我关闭应用程序并再次运行它,则E45不再存在。

UPDATE
我已更新上面的代码。我在viewDidLoad中使用fetchFavDX,所以我尝试在上面的代码中更新的方法中调用它。而在fetchFavDX我这样做:

-(void)fetchFavDX { 
    self.favDXArray = [NSMutableArray arrayWithArray:[DX MR_findAllSortedBy:@"code" ascending:YES]]; 
} 

现在是前两个时代意义添加/删除/添加/删除工作的罚款。之后,它只运行if (!foundDX.code)块,这意味着它没有进入其他部分。

+0

您是否可以使用崩溃日志更新上述内容?请 – HarmVanRisk

+0

@HarmVanRisk它的索引0超出了空数组的边界,这表明对象被删除,如果我再次运行应用程序,这是正确的。但是,如果它是相同的运行它崩溃与此错误。 –

您应该检查self.favDXArray计数是否比indexpath.row更长,以便有实际移除/检索的内容。这将是这样的:

if(self.favDXArray.count > indexPath.row){ 
    DX *tempDX = [self.favDXArray objectAtIndex:indexPath.row]; 
    [tempDX MR_deleteEntity]; 
    [cell.DXFavButton setImage:[UIImage imageNamed:@"star_blank"] forState:UIControlStateNormal]; 
    [self.favDXArray removeObjectAtIndex:indexPath.row]; 
    [KSToastView ks_showToast:@"Removed from Favourite" duration:1.0f]; 
    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 
} 

更新

if (!foundDX.code) { 
//If we are always getting into here that means that either foundDX is nil 
//or the code is nil so you need to verify the logic around that. 
    if (indexPath != nil) 
    { 
     self.AddEditDX = [DX MR_createEntity]; 
     [self.AddEditDX setCode:cell.DXCodeName.text]; 
     [self.AddEditDX setDescriptions:cell.DXDescText.text]; 
     [self.AddEditDX setIsFav:[NSNumber numberWithInt:1]]; 

     [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 
     [self.favDXArray addObject:self.AddEditDX]; 
     [self fetchFavDX]; 

     [cell.DXFavButton setImage:[UIImage imageNamed:@"star_filled"] forState:UIControlStateNormal]; 
     [KSToastView ks_showToast:@"Added to Favourite" duration:1.0f]; 

    } 
} else if(self.favDXArray.count > indexPath.row) { 
//You can get rid of the if(foundDX.code) because this is the else block to not having it so we must have it. 
//Only thing to worry about is the array size 
    NSLog(@"count is: %ld and row is: %ld",_favDXArray.count, (long)indexPath.row); 
    DX *tempDX = [self.favDXArray objectAtIndex:indexPath.row]; 
    [tempDX MR_deleteEntity]; 

    [cell.DXFavButton setImage:[UIImage imageNamed:@"star_blank"] forState:UIControlStateNormal]; 
    [self.favDXArray removeObjectAtIndex:indexPath.row]; 
    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 
    [KSToastView ks_showToast:@"Removed from Favourite" duration:1.0f]; 
} 

确保方法来获取foundDX将返回你期待什么。另外,请确保添加/删除功能将您置于所期望的状态,即您拥有添加或删除的内容

+0

这个答案给了我一些东西,我可以感觉到我即将完成它。你能否看到更新的问题并相应地更新你的答案。 –

+0

@TalhaCh我已尽我所能地更新了您所提供的内容。希望它会帮助你 – HarmVanRisk

+0

现在,如果我运行该项目,它第一次运行它意味着添加>删除>添加,那么它似乎'[self.favDXArray addObject:self.AddEditDX];'没有添加值。因为在此之后计数为零。这是因为它正在重复我的想法。 –