【问题标题】:to check an coredata object is nil检查 coredata 对象是否为零
【发布时间】:2012-05-02 00:33:14
【问题描述】:

我想找出核心数据中的对象,我的代码:

类型:

signedDate(日期)

alarmDate(日期)

starTime(NSDate)

endTime(NSDate)

NSString *str = @"(signedDate >= %@) AND (signedDate < %@) AND (alarmDate == nil)";
NSPredicate *predicate = [NSPredicate predicateWithFormat:str, starTime, endTime];
[request setPredicate:predicate];
NSArray *results=[context executeFetchRequest:request error:nil];

谓词错了? 如何判断一个coredata对象是nil? 谓词应该是什么?

【问题讨论】:

  • 请在 str 分配中添加一个结束 " 以修复颜色格式。我不能,因为该编辑少于 6 个字符。

标签: ios core-data nspredicate


【解决方案1】:

我不认为谓词语法需要 == nil。 只使用一个 =

NSString *str = @"(signedDate >= %@) AND (signedDate < %@) AND (alarmDate = nil)";

您上面的代码工作正常。它应该是 YES,因为它是 nil。

BOOL ok;
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
ok = [predicate evaluateWithObject:[NSDictionary dictionary]];

ok = [predicate evaluateWithObject:
[NSDictionary dictionaryWithObject:[NSNull null] forKey:@"firstName"]]; 

【讨论】:

【解决方案2】:

来自apple docs

空值测试

如果要匹配空值,除了其他比较之外,还必须包含特定测试,如下面的片段所示。

predicate = [NSPredicate predicateWithFormat:@"(firstName == %@) || (firstName = nil)", firstName];
filteredArray = [array filteredArrayUsingPredicate:predicate];
NSLog(@"filteredArray: %@", filteredArray);

// Output:
// filteredArray: ( { lastName = Turner; }, { birthday = 1972-03-23 20:45:32 -0800; firstName = Ben; lastName = Ballard; }

暗示,匹配空值的空测试返回真。在以下代码片段中,两个谓词计算的 ok 都设置为 YES。

BOOL ok;
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
ok = [predicate evaluateWithObject:[NSDictionary dictionary]];

ok = [predicate evaluateWithObject:
    [NSDictionary dictionaryWithObject:[NSNull null] forKey:@"firstName"]];

【讨论】:

  • 我不明白,如何编辑我的代码? alarmDate 是 coredata 实体中的一个属性
  • 我只是想找出它的signedDate在startTime和endTime之间的对象,而且alarmDate是nil
  • 是的,但是你怎么知道它不起作用,是抛出错误还是返回错误的结果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2010-12-23
相关资源
最近更新 更多