繁体   English   中英

predicateWithFormat返回错误的Core数据对象

[英]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将您的更改保存到localImagelocalImage

轻松修复。 只需在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM