需要编写一个谓词来搜索核心数据对象数组属性中的日期(在我的例子中是日期数组)

Posted

技术标签:

【中文标题】需要编写一个谓词来搜索核心数据对象数组属性中的日期(在我的例子中是日期数组)【英文标题】:Need to write a predicate to search for a date in a core data object's array property (in my case array of dates) 【发布时间】:2015-07-07 15:48:59 【问题描述】:

我需要使用 Core Data 获取一个对象。该对象有一个属性 datesArray(存储为 NSData 的 NSDate 对象数组),我用它来存储日期数组。我需要检查数组是否包含今天的日期,然后使用该对象。

NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"MyEntity"];
NSError * error;
NSArray * fetchedArray = [context executeFetchRequest:request error:&error];
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"entity.datesArray CONTAINS  %@",[NSDate date]];
for (MyEntity * entity in fetchedArray) 
    NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:entity.datesArray];
    [array filterUsingPredicate:predicate];
    if (array.count >0) 
        [_myMutableArray addObject:entity];
    

【问题讨论】:

NSManagedObject 的实例不能将数组作为属性,因此您的问题需要进行一些清理。那个属性是什么样子的?它是如何建模的?您实际上是在处理与另一个包含日期的对象的关系吗?可能最好显示模型这部分的图片。 我知道 NSManagedObject 不能将数组作为属性。这就是为什么我使用 NSData 来存储数组,然后使用 NSKeyedUnarchiver 检索它。该部分工作正常。 【参考方案1】:

您真的不应该这样存储日期。你正在失去使用 Core Data 的价值。如果你有一个数组,那么它应该位于关系的另一端,然后你可以从底层持久存储中有效地检索。

我怀疑您的谓词缺乏精确度,因为日期对象精确到纳秒。如果您正在寻找匹配“今天”的内容,那么您需要处理精度较低的内容。也许是特定格式的字符串或将其存储为数字,然后在一个范围内搜索(小于 X 和大于 Y 类型的搜索)。

同样,将实际日期存储在托管对象中会使这个问题变得更容易,但您仍然需要处理精度问题。

【讨论】:

以上是关于需要编写一个谓词来搜索核心数据对象数组属性中的日期(在我的例子中是日期数组)的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:谓词中的对象

作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词

子查询谓词核心数据

核心数据谓词 - 检查数组中的任何元素是不是与另一个数组中的任何元素匹配

带有核心数据对象的 NSPredicate

xCode / iOS - 需要帮助使核心数据搜索谓词工作