Core数据布尔键值更改未反映在提取中 [英] Core Data boolean key value change not reflected in fetch

查看:84
本文介绍了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数据布尔键值更改未反映在提取中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆