Core data 需要编写谓词来搜索核心数据对象中的日期';s数组属性(在我的示例中是日期数组)

Core data 需要编写谓词来搜索核心数据对象中的日期';s数组属性(在我的示例中是日期数组),core-data,nspredicate,nsfetchrequest,Core Data,Nspredicate,Nsfetchrequest,我需要使用核心数据获取一个对象。该对象有一个属性datesArray(存储为NSData的NSDate对象数组),我用它来存储日期数组。我需要检查数组是否包含todays日期,然后使用该对象 NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"MyEntity"]; NSError * error; NSArray * fetchedArray = [context executeFetchRequest

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

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];
    }
}

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

我怀疑您的谓词缺乏精确性,因为日期对象的精度只有纳秒。如果你想和《今日》中的内容相匹配,那么你需要做一些精度较低的事情。可能是一个特定格式的字符串,或者将其存储为一个数字,然后在一个范围内进行搜索(搜索类型小于X,大于Y)


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

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