Core数据布尔键值更改未反映在提取中

编程入门 行业动态 更新时间:2024-10-09 08:29:17
本文介绍了Core数据布尔键值更改未反映在提取中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

给定一个NSManagedObject子类的布尔属性删除(这是用两种不同的方式用下面的代码演示,因为两种方法都不工作):

代码清单1]

@interface MyManagedObject:NSManagedObject @property保留)NSNumber * deleted; //或@property(nonatomic)BOOL deleted;创建并插入到Core Data中的 @end

[代码清单2]

元数据.deleted = [NSNumber numberWithBool:NO]; // metadata.deleted = NO;

并提取

代码清单3]

//设置实体描述 NSEntityDescription * entityDescription = [self entityDescription]; //设置排序器 NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@createdAtascending:YES]; NSSortDescriptor * sortDescriptorSection = [[NSSortDescriptor alloc] initWithKey:@myManagedObject.category.titleascending:YES]; //构建请求 NSFetchRequest * request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; [request setSortDescriptors:[NSArray arrayWithObjects:sortDescriptorSection,sortDescriptor,nil]]; [request setPredicate:[NSPredicate predicateWithFormat:@deleted ==%@,[NSNumber numberWithBool:NO]]]; //获取请求 NSArray * items = [[self managedObjectContext] executeFetchRequest:request error:nil];

返回items数组中的一个项目。

MyManagedObject * myManagedObject; //假设已初始化 myManagedObject.deleted = [NSNumber numberWithBool:YES]; // myManagedObject.deleted = YES; //在调试器中打印myManagedObject的描述显示deleted = 0在这一点 [myManagedObject.managedObjectContext save:nil]; //在调试器中打印myManagedObject的描述仍然显示deleted = 0在这一点 BOOL testValue = myManagedObject.deleted; if(testValue){ NSLog(@value updated); //此行被执行}

重新执行代码清单3仍然会产生一个项目在items数组中,即使在NSFetchResultsController观察数据库已触发更新之后。如果应用程序被终止并重新启动,重新执行代码清单3不会在项目NSArray中产生任何项目。

解决方案

数据属性已删除与 NSManagedObject 的 isDeleted 属性冲突。

比较核心数据NSPredicate predicateWithBlock和predicateWithFormat在父子上下文用于类似问题和一些实验。

Btw。调用属性更新也会导致问题,比较不能请使用比较Magical Record中的日期的谓词。

Given an NSManagedObject subclass with a boolean property deleted (this is demonstrated in two different ways with code below since both approaches are not working):

[Code Listing 1]

@interface MyManagedObject : NSManagedObject @property (nonatomic, retain) NSNumber *deleted; // Or @property (nonatomic) BOOL deleted; @end

created and inserted into Core Data as follows:

[Code Listing 2]

metadata.deleted = [NSNumber numberWithBool:NO]; // metadata.deleted = NO;

and fetched

[Code Listing 3]

// setup entity description NSEntityDescription* entityDescription = [self entityDescription]; // setup the sorter NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES]; NSSortDescriptor* sortDescriptorSection = [[NSSortDescriptor alloc] initWithKey:@"myManagedObject.category.title" ascending:YES]; // Build request NSFetchRequest* request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; [request setSortDescriptors:[NSArray arrayWithObjects:sortDescriptorSection, sortDescriptor, nil]]; [request setPredicate:[NSPredicate predicateWithFormat:@"deleted == %@", [NSNumber numberWithBool:NO]]]; // Fetch request NSArray* items = [[self managedObjectContext] executeFetchRequest:request error:nil];

returns one item in the items array as expected. The problem is when deleted is modified:

[Code Listing 4]

MyManagedObject* myManagedObject; // Assume initialized myManagedObject.deleted = [NSNumber numberWithBool:YES]; // myManagedObject.deleted = YES; // Printing description of myManagedObject in debugger shows deleted = 0 at this point [myManagedObject.managedObjectContext save:nil]; // Printing description of myManagedObject in debugger still shows deleted = 0 at this point BOOL testValue = myManagedObject.deleted; if (testValue) { NSLog(@"value updated"); // This line is executed }

Re-executing code listing 3 still yields one item in the items array even after a NSFetchResultsController watching the database has fired an update. If the application is terminated and relaunched, re-executing code listing 3 yields no items in the items NSArray.

解决方案

Calling a Core Data property "deleted" conflicts with the isDeleted property of NSManagedObject.

Compare Core Data NSPredicate predicateWithBlock and predicateWithFormat in Parent Child Context for a similar problem and some experiments.

Btw. calling a property "updated" causes also problems, compare Cannot use a predicate that compares dates in Magical Record.

更多推荐

Core数据布尔键值更改未反映在提取中

本文发布于:2023-11-01 11:05:33,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:布尔   键值   数据   Core

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!