CONTEXT
Realm不支持关系属性(对象)的索引。 https://realm.io/docs/objc/latest/#indexed-properties 如果你尝试,它会抛出一个错误。
我们需要查询模型的关系和另一个属性。
通常你会通过覆盖(foreign_id,property)覆盖索引来做到这一点,但这在Realm中似乎不可能(但是?)
例如
@interface Book : RLMObject
@property NSNumber<RLMInt> * page;
@end
@interface Page : RLMObject
@property Book * book;
@property NSNumber<RLMInt> * line;
@end
[Page objectsInRealm:realm where:@"book.uuid = %@ AND page.line = %@", uuid, @1];
问题
设置索引以使上述查询最佳的最佳方法是什么? 关系是否已编入索引? 或者我是否在页面上创建另一个属性,名为book_uuid,并在其上创建索引?
干杯
答案 0 :(得分:1)
Realm并不真正迎合关系数据库的外键机制,因此在设计数据模型时更容易摆脱这种思维模式。
在这种情况下,我认为您的Book
模型存储所有页面的数组(与外键概念相反)更合适,您可以使用它来初始过滤页面到那本书,然后查询特定的页面行:
@interface Page : RLMObject
@property NSInteger line;
@end
RLM_ARRAY_TYPE(Page)
@interface Book : RLMObject
@property RLMArray<Page *><Page> *pages;
@end
Book *book = [[Book allObjects] firstObject];
Page *page = [[book.pages objectsWhere:@"line = %@", @1] firstObject];
只要您将line
标记为索引属性,理论上这应该非常快。但是既然你已经提到过你有数以千计的页面内容,我很想知道这会是什么样的真实表现。