簡體   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