[英]predicateWithFormat returns wrong Core data object
我的应用程序包含它从服务器接收的图像对象,并且存储在Core数据中。 每个对象都包含image = NSData imageId = NSString和imageKeyword = NSString要检查是否已从服务器删除任何图像,应用程序将接收一个image_id数组,该数组与应用程序中包含的image_ids进行比较,并删除所有不包含在其中的图像从服务器的阵列中找到。
该方法使用NSPredicate查找是否在应用程序从服务器接收的allImageArray中找到了imageId。 找不到的对象将添加到imageToDelete数组,然后从核心数据中删除。 只要对象仅包含imageId和image,此方法就可以正常工作。
-(void)updateLocalImagesFromActivitiesParents:(NSArray*)allImageArray
{
NSPredicate *imageIdsFilter = [NSPredicate predicateWithFormat:@"NOT (imageId IN %@)", allImageArray];
NSFetchRequest *imageIdsRequest = [ImageCD MR_requestAllWithPredicate:(NSPredicate *)imageIdsFilter];
NSArray *imagesToDelete = [ImageCD MR_executeFetchRequest:imageIdsRequest];
if([imagesToDelete count] > 0){
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext){
for(ActivityCD *imageToDelete in imagesToDelete){
[imageToDelete MR_deleteEntityInContext:localContext];
[localContext MR_saveToPersistentStoreAndWait];
}
}];
}
}
但是我注意到,每次我为imageKeyword分配一个值时,上述方法detect在allImageArray中都找不到并删除它。 我很难理解为什么会发生这种情况,因为delete方法应该只查找imageid,但似乎也检测到imageKeyword中的更改。
来自已删除对象的日志的样本。 如前所述,在服务器的allImageArray中找到了ImageId = 25245,仅当我在imageKeyword中添加“ word”时才将其删除。
"<ImageCD: 0x600003464c80> (entity: ImageCD; id: 0xa0c6b9257bed7492 <x-coredata://6454DD11-CEDB-40C2-B5E0-1FEE8006EE92/ImageCD/p26> ; data: {\n image = <89504e47 0d0a1a0a 0000000d 49484452 00000280 00000203 08020000 001b8b38 02000020 00494441 54789c84 bd4982e5 b8ae>;\n imageId = 25245;\n imageKeyword = word;\n})"
这是我将imageKeyWord分配给对象的方法。
-(void)setImageKeyWord
{
ImageCD *localImage = [ImageCD MR_findFirstByAttribute:@"imageId" withValue:[NSString stringWithFormat:@"%@", _choosenImageId]];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext * _Nonnull localContext) {
localImage.imageKeyword = _userCreate;
}];
[self testingKeyWordSearch];
}
我猜我在某种程度上给imagKeyWord分配了错误,但是我不知道怎么做。 希望得到一些支持:)
-(void)setImageKeyWord
{
[MagicalRecord saveWithBlock:^(NSManagedObjectContext * _Nonnull localContext) {
ImageCD *localImage = [ImageCD MR_findFirstByAttribute:@"imageId"
withValue:[NSString stringWithFormat:@"%@", _choosenImageId]
inContext:localContext];
localImage.imageKeyword = _userCreate;
}];
[self testingKeyWordSearch];
}
在您的代码中,您调用findFirstByAttribute
。 它在defaultContext
上返回ImageCD
的实例。
更改imageKeyword
的值时,将在defaultContext
上对其进行更改。 不在saveWithBlock
可用的localContext
中。
当saveWithBlock
完成时,您什么都没有保存! 下次defaultContext
将您的更改保存到localImage
将localImage
。
轻松修复。 只需在saveWithBlock
调用findFirstByAttribute
并使用localContext
。 当saveWithBlock
完成时,它将把localContext
合并到defaultContext
。
为了安全起见,我将更改您的第一段代码,以便所有获取和删除都在同一上下文中:
-(void)updateLocalImagesFromActivitiesParents:(NSArray*)allImageArray
{
NSPredicate *imageIdsFilter = [NSPredicate predicateWithFormat:@"NOT (imageId IN %@)", allImageArray];
if([imagesToDelete count] > 0){
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext){
NSFetchRequest *imageIdsRequest = [ImageCD MR_requestAllWithPredicate:(NSPredicate *)imageIdsFilter inContext:localContext];
NSArray *imagesToDelete = [ImageCD MR_executeFetchRequest:imageIdsRequest inContext:localContext];
for(ActivityCD *imageToDelete in imagesToDelete){
[imageToDelete MR_deleteEntityInContext:localContext];
[localContext MR_saveToPersistentStoreAndWait];
}
}];
}
}
您可能应该阅读有关NSManagedObjectContext
MagicalRecord和Apple文档。 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.