为什么Realm在查询`size == 4`时会抛出异常?

0xx*_*xxD 4 database realm ios

我的子类RLMObject看起来像这样:

@interface ImageRealm : RLMObject

@property NSString *httpsURL;
@property NSNumber<RLMInt> *size;

@end

RLM_ARRAY_TYPE(ImageRealm)

@interface PhotoRealm : RLMObject

@property NSNumber<RLMInt> *photoID;
@property RLMArray<ImageRealm *><ImageRealm> *differentSizeImages;  

- (id)initWithMantleModel:(PhotoModel *)photoModel;

@end
Run Code Online (Sandbox Code Playgroud)

我想过滤数组以检索特定PhotoRealmdifferentSizeImages数组ImageRealm.我尝试使用以下代码:

PhotoRealm *photo = self.array[indexPath.row];
NSString *filter = @"size == 4";
ImageRealm *pecificImage = [[photo.differentSizeImages objectsWhere:filter] firstObject];
Run Code Online (Sandbox Code Playgroud)

在哪里self.array初始化如下:

self.array = [PhotoRealm allObjects];
Run Code Online (Sandbox Code Playgroud)

代码抛出异常:

2017-03-24 03:33:36.891 project_name [46277:3636358]***由于未捕获的异常终止应用程序'无效的谓词表达式',原因:'谓词表达式必须比较一个键路径和另一个键路径或一个常量值'


更新: 在我添加size属性之前,我能够执行以下操作(因为我只有一个图像大小):

ImageRealm *image = [photo.differentSizeImages objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

但是现在我已经添加了size我需要过滤数组的属性来选择正确的大小图像.

有关Realm文件中数据的概念,请参阅以下图像:

照片

[differentSizeImgae [2]


而且,我注意到Realm官方文档中的示例查询:

// Query using a predicate string
RLMResults<Dog *> *tanDogs = [Dog objectsWhere:@"color = 'tan' AND name BEGINSWITH 'B'"];

// Query using an NSPredicate
NSPredicate *pred = [NSPredicate predicateWithFormat:@"color = %@ AND name BEGINSWITH %@",
                                                     @"tan", @"B"];
tanDogs = [Dog objectsWithPredicate:pred];
Run Code Online (Sandbox Code Playgroud)

这看起来和我正在做的一样,为什么我会看到异常?

bda*_*ash 12

尝试使用谓词格式字符串时size == 4,您会看到如下异常:

由于未捕获的异常'无效的谓词表达式'而终止应用程序,原因:'谓词表达式必须比较一个键路径和另一个键路径或一个常量值'

原因是它sizeNSPredicate格式语法中的保留字.您可以通过在前面添加#字符来转义保留字,这样您的查询就会变为#size == 4

  • 如果没有人说出这个伎俩,我想我必须困惑很久: - ) (2认同)