当属性为 nil 时核心数据谓词崩溃
Core Data predicate crashes when attribute is nil
tl;dr:如果 birthDate 为 nil,请在此处输入不会崩溃的内容:
我有一个带有 birthDate 属性的实体和一个带有以下谓词的 属性,直接输入到 xcdatamodel 文件中:
$FETCH_SOURCE.birthDate > birthDate
这很高兴 returns 早于 FETCH_SOURCE 的托管对象列表(发生获取请求的托管对象)。但是 birthDate 是可选的,如果 FETCH_SOURCE 的 birthDate 是 nil...
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'can't use NULL on left hand side'
请注意,如果正在比较的对象的属性为 nil 就可以了。如果我交换谓词的参数:
birthDate < $FETCH_SOURCE.birthDate
...我得到同样的错误。尝试测试它是否为零:
(birthDate != nil AND birthDate < $FETCH_SOURCE.birthDate)
...给出...
'NSInvalidArgumentException', reason: 'illegal comparison with NULL'
Google 没有听说过这些错误中的任何一个,所以我认为这是最近的事态。当比较 String 是否等价时,问题仍然存在。有没有办法在谓词中解决这个问题,以便它正确 returns 一个空列表?谢谢。
编辑:明确地说,问题是是否可以修复 xcdatamodel 文件中谓词的崩溃。
更新:崩溃特别发生在 NSFetchedPropertyDescription 的关系错误通过尝试读取有关它的任何内容而触发时,大概是因为它直到那时才尝试 运行 谓词。然而,它不是零,并且可以在不崩溃的情况下检查它是否为零。
如果您希望结果包含 nil 值或者它必须大于或小于特定日期,请使用以下命令:
((birthDate == nil) OR (birthDate < %@))
这对我有用。我希望这就是你要问的。理解你的问题有点困难。
如果您要求检查您在谓词中传递的变量,可能会执行以下操作(未经测试):
(($FETCH_SOURCE.birthDate == nil && birthDate == nil) OR ($FETCH_SOURCE.birthDate < birthDate))
我找不到任何方法来修改获取的 属性 的谓词以避免此错误,但一种解决方法是为获取的 olderHeroes
实现自定义 getter 属性。如果 birthDate
为零,这应该 return 一个空数组。
var olderHeroes: NSArray {
var array : NSArray
if self.birthDate == nil {
array = NSArray()
} else {
self.willAccessValueForKey("olderHeroes")
array = self.primitiveValueForKey("olderHeroes") as! NSArray
self.didAccessValueForKey("olderHeroes")
}
return array
}
或在Objective-C:
-(NSArray *)olderHeroes {
NSArray *array;
if (self.birthDate == nil) {
array = [NSArray array];
} else {
[self willAccessValueForKey:@"olderHeroes"];
array = [self primitiveValueForKey:@"olderHeroes"];
[self didAccessValueForKey:@"olderHeroes"];
}
return array;
}
(这些片段在 FETCH_SOURCE 实体的子类的实现文件中)。
tl;dr:如果 birthDate 为 nil,请在此处输入不会崩溃的内容:
我有一个带有 birthDate 属性的实体和一个带有以下谓词的 属性,直接输入到 xcdatamodel 文件中:
$FETCH_SOURCE.birthDate > birthDate
这很高兴 returns 早于 FETCH_SOURCE 的托管对象列表(发生获取请求的托管对象)。但是 birthDate 是可选的,如果 FETCH_SOURCE 的 birthDate 是 nil...
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'can't use NULL on left hand side'
请注意,如果正在比较的对象的属性为 nil 就可以了。如果我交换谓词的参数:
birthDate < $FETCH_SOURCE.birthDate
...我得到同样的错误。尝试测试它是否为零:
(birthDate != nil AND birthDate < $FETCH_SOURCE.birthDate)
...给出...
'NSInvalidArgumentException', reason: 'illegal comparison with NULL'
Google 没有听说过这些错误中的任何一个,所以我认为这是最近的事态。当比较 String 是否等价时,问题仍然存在。有没有办法在谓词中解决这个问题,以便它正确 returns 一个空列表?谢谢。
编辑:明确地说,问题是是否可以修复 xcdatamodel 文件中谓词的崩溃。
更新:崩溃特别发生在 NSFetchedPropertyDescription 的关系错误通过尝试读取有关它的任何内容而触发时,大概是因为它直到那时才尝试 运行 谓词。然而,它不是零,并且可以在不崩溃的情况下检查它是否为零。
如果您希望结果包含 nil 值或者它必须大于或小于特定日期,请使用以下命令:
((birthDate == nil) OR (birthDate < %@))
这对我有用。我希望这就是你要问的。理解你的问题有点困难。
如果您要求检查您在谓词中传递的变量,可能会执行以下操作(未经测试):
(($FETCH_SOURCE.birthDate == nil && birthDate == nil) OR ($FETCH_SOURCE.birthDate < birthDate))
我找不到任何方法来修改获取的 属性 的谓词以避免此错误,但一种解决方法是为获取的 olderHeroes
实现自定义 getter 属性。如果 birthDate
为零,这应该 return 一个空数组。
var olderHeroes: NSArray {
var array : NSArray
if self.birthDate == nil {
array = NSArray()
} else {
self.willAccessValueForKey("olderHeroes")
array = self.primitiveValueForKey("olderHeroes") as! NSArray
self.didAccessValueForKey("olderHeroes")
}
return array
}
或在Objective-C:
-(NSArray *)olderHeroes {
NSArray *array;
if (self.birthDate == nil) {
array = [NSArray array];
} else {
[self willAccessValueForKey:@"olderHeroes"];
array = [self primitiveValueForKey:@"olderHeroes"];
[self didAccessValueForKey:@"olderHeroes"];
}
return array;
}
(这些片段在 FETCH_SOURCE 实体的子类的实现文件中)。