Realm 将属性分配给RLMObject的子类

Realm 将属性分配给RLMObject的子类,realm,Realm,我试图使用RLMObject的一个子类作为RLMObject的另一个子类的属性的基类,但运气不好。这是已知的限制,还是有解决方法 测试m: #import <XCTest/XCTest.h> #import <Realm/Realm.h> @interface Base : RLMObject; @end @interface Derived : Base; @end @interface User : RLMObject @property Base *obj; @

我试图使用RLMObject的一个子类作为RLMObject的另一个子类的属性的基类,但运气不好。这是已知的限制,还是有解决方法

测试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
#导入
#进口
@接口库:RLMObject@结束
@派生接口:基@结束
@界面用户:RLMObject
@财产基数*obj;
@结束
@实施基础@结束
@实现派生@结束
@实现用户@结束
@接口rlmrlmTests:XCTestCase@结束
@实现RLMRLMT测试
-(void)testOK{
用户*User=[[User alloc]init];
user.obj=[[Base alloc]init];//确定
[[RLMRealm defaultRealm]transactionWithBlock:^{
[[RLMRealm defaultRealm]addObject:user];
}];
}
-(void)testZFail{
用户*User=[[User alloc]init];
user.obj=[[Derived alloc]init];//错误
[[RLMRealm defaultRealm]transactionWithBlock:^{
[[RLMRealm defaultRealm]addObject:user];
}];
}
@结束
将得到一个异常,它说:

错误:-[rlmrlmTests TestsFail]:失败:捕获到“RLMEException”,“无法将“派生”类型的对象设置为“基”类型的属性”


这是目前的领域限制。这取决于关系

如果可能的话,在这种情况下我会避免继承。您可以通过更改对象关系映射来实现这一点:您可以向
Base
类添加进一步的鉴别器列,并与包含进一步属性且不再从
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

很高兴知道,谢谢@marius。虽然我可以按照你提到的方式,但extA和extB应该列在ignoredProperties中。据我所知,在保存具有这些属性的RLMObject时,ignoredProperties中列出的属性不会在域中暂时保存。。。