【问题标题】:Custom method in Managed Object for Core data predicateCore 数据谓词的托管对象中的自定义方法
【发布时间】:2014-08-02 13:53:15
【问题描述】:

我想根据存储属性的 (NSDate) 月份执行谓词。 我知道比较开始日期和结束日期(手动设置)允许这样做。

但我觉得托管对象类中的自定义方法也应该相当容易地实现这一点?好吧,我试过了,但我似乎无法通过让谓词触发它来访问一个简单的方法。这有可能吗?

托管对象文件:

.h 文件:

@property (nonatomic,retain) NSNumber *monthOfDate;
-(NSNumber *)monthOfDate;

.m 文件:

@synthesize monthOfDate;

-(NSNumber *) monthOfDate
{
NSDate *date = [self start];
NSDateComponents *components = [[NSCalendar currentCalendar]components: NSCalendarUnitMonth   fromDate:date];
NSNumber *month = [NSNumber numberWithInteger:[components month]];
return month;
}

这是我的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"client == %@ AND monthOfDate == %d", clientMO,int 6];

它返回一个错误:keypath monthOfDate not found in entity。我想是因为它不是实际属性?我怎样才能让它被检测到?

更新

上面的 .h 和 .m 文件来自自动生成的 Event 类(NSmanaged 对象)。我可能会稍后将我的自定义代码移动到一个类别,但到目前为止,不需要修改数据库模型。

下面是 FetchedResultsController(在 uiviewcontroller 类中)设置,其中提到了谓词:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Event" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortfix = [[NSSortDescriptor alloc]initWithKey:@"timeStamp" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortfix,nil]];
[fetchRequest setFetchBatchSize:20];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"client == %@ AND monthOfDate == %d", clientMO,int 6];
[fetchRequest setPredicate:predicate];


NSFetchedResultsController *theFetchedResultsController =

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:managedObjectContext sectionNameKeyPath:sectionKeyPathProperty
                                               cacheName:nil];

//sectionKeyPathProperty is a variable that let's me choose one of multiple transient properties I have created for creating relevant sections.

self.fetchedResultsControllerClient = theFetchedResultsController;
_fetchedResultsControllerClient.delegate = self;

return _fetchedResultsControllerClient;

【问题讨论】:

  • 这可能不是答案:但你的谓词的第二个参数,应该是:monthToDate == .... 并且只使用 int 6。
  • 你是对的,多次重新输入的一个错字:) 程序没有达到这一点,第二次触发 monthToDate 它给出了错误。
  • 使用完整的 FRC 更新代码以增加便利性。

标签: ios core-data nspredicate nsfetchedresultscontroller nsmanagedobject


【解决方案1】:

事实证明,只有当 MO 已经加载到内存中时才有可能。 (获取)

在我使用 FRC 的情况下,情况并非如此,因此我必须创建一个单独的月份属性,该属性在创建 MO 时保存。

感谢用户 Run Loop 回答了一个 4 年前的问题!

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多