我试图使用RLMObject的子类作为RLMObject的其他子类的属性的基类,没有运气。这是一个已知的限制,还是有解决方法?
test.m:
#import <XCTest/XCTest.h>
#import <Realm/Realm.h>
@interface Base : RLMObject; @end
@interface Derived : Base; @end
@interface User : RLMObject
@property Base *obj;
@end
@implementation Base; @end
@implementation Derived; @end
@implementation User; @end
@interface rlmrlmTests : XCTestCase; @end
@implementation rlmrlmTests
- (void) testOK {
User *user = [[User alloc] init];
user.obj = [[Base alloc] init]; // OK
[[RLMRealm defaultRealm] transactionWithBlock:^{
[[RLMRealm defaultRealm] addObject:user];
}];
}
- (void) testZFail {
User *user = [[User alloc] init];
user.obj = [[Derived alloc] init]; // ERROR
[[RLMRealm defaultRealm] transactionWithBlock:^{
[[RLMRealm defaultRealm] addObject:user];
}];
}
@end
会有例外说法:
错误: - [rlmrlmTests testZFail]:失败:捕获&#34; RLMException&#34;,&#34;无法设置类型对象&#39; Derived&#39;属于&#39; Base&#39;&#34;
的财产
答案 0 :(得分:0)
这是Realm的当前限制。关于关系doesn't support polymorphism。
如果可能的话,在这种情况下我会避免继承。您可以通过更改对象关系映射来实现:您可以向Base
类添加另一个 discriminator 列,并与包含更多属性的类关联,并且不再继承Base
课程。@interface Base : RLMObject
@property NSString *discriminator;
@property BaseExtensionA *extA;
@property BaseExtensionB *extB;
@end
@interface BaseExtensionA : RLMObject
// the properties of the prior `Derived` would go here
@end
@interface BaseExtensionB : RLMObject
// …
@end
。如果您只有一个子类,则最终不需要 discriminator 列。
{{1}}