Removed Entity 再次被 MagicalRecord 中的 findFirstByAttribute 找到
Removed Entity is again found by findFirstByAttribute in MagicalRecord
我正在使用 MagicalRecord CoreData 包装器在我的应用程序中使用 Favorite 场景。我正在搜索的值是,如果在我的实体中找到该属性,它会将其作为收藏夹删除,否则会将其添加到收藏夹。在此处执行 DX *foundDX = [DX MR_findFirstByAttribute:@"code" withValue:cell.DXCodeName.text];
foundDX 是我要检查的值。
我已将 UISearchBar 添加到我的 tableView。因此,当加载视图时,它会显示使用 can un-fav 的已经收藏的项目。如果用户搜索并 select 一个项目,它会成功地将其添加到收藏夹并成功地将其从数据模型中删除。但是,如果我再次点击收藏按钮,它就会崩溃。
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];
}
通过应用一些断点我发现:
假设代码是E45
并且foundDX
没有第一次找到它并将其添加到数据模型中。然后再次按下 fav 按钮将其删除,实际上它确实将其删除。但是,如果我再次点击 fav 按钮,foundDX 仍然是 E45
,因此它会崩溃。但是如果我关闭应用程序并再次 运行 它 E45
就不再存在了。
更新
我已经更新了上面的代码。我在 viewDidLoad
中使用 fetchFavDX
所以我尝试在上面代码中更新的方法中调用它。而在 fetchFavDX
中,我这样做:
-(void)fetchFavDX {
self.favDXArray = [NSMutableArray arrayWithArray:[DX MR_findAllSortedBy:@"code" ascending:YES]];
}
现在前两次工作正常,这意味着 add/remove/add/remove。之后它只 运行 块 if (!foundDX.code)
意味着它没有进入 else 部分。
您应该检查 self.favDXArray 计数是否比 indexpath.row 长,以便实际 remove/retrieve 有一些东西。应该是这样的:
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 的方法返回您所期望的。还要确保 add/remove 让您处于您期望的状态,即您拥有已添加或删除的内容
我正在使用 MagicalRecord CoreData 包装器在我的应用程序中使用 Favorite 场景。我正在搜索的值是,如果在我的实体中找到该属性,它会将其作为收藏夹删除,否则会将其添加到收藏夹。在此处执行 DX *foundDX = [DX MR_findFirstByAttribute:@"code" withValue:cell.DXCodeName.text];
foundDX 是我要检查的值。
我已将 UISearchBar 添加到我的 tableView。因此,当加载视图时,它会显示使用 can un-fav 的已经收藏的项目。如果用户搜索并 select 一个项目,它会成功地将其添加到收藏夹并成功地将其从数据模型中删除。但是,如果我再次点击收藏按钮,它就会崩溃。
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];
}
通过应用一些断点我发现:
假设代码是E45
并且foundDX
没有第一次找到它并将其添加到数据模型中。然后再次按下 fav 按钮将其删除,实际上它确实将其删除。但是,如果我再次点击 fav 按钮,foundDX 仍然是 E45
,因此它会崩溃。但是如果我关闭应用程序并再次 运行 它 E45
就不再存在了。
更新
我已经更新了上面的代码。我在 viewDidLoad
中使用 fetchFavDX
所以我尝试在上面代码中更新的方法中调用它。而在 fetchFavDX
中,我这样做:
-(void)fetchFavDX {
self.favDXArray = [NSMutableArray arrayWithArray:[DX MR_findAllSortedBy:@"code" ascending:YES]];
}
现在前两次工作正常,这意味着 add/remove/add/remove。之后它只 运行 块 if (!foundDX.code)
意味着它没有进入 else 部分。
您应该检查 self.favDXArray 计数是否比 indexpath.row 长,以便实际 remove/retrieve 有一些东西。应该是这样的:
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 的方法返回您所期望的。还要确保 add/remove 让您处于您期望的状态,即您拥有已添加或删除的内容