将属性分配给RLMObject的子类

时间:2015-03-04 08:15:39

标签: realm

我试图使用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;

的财产

1 个答案:

答案 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}}