[英]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.