为什么Realm addOrUpdateObject导致属性设置为nil?

时间:2016-12-08 00:17:45

标签: ios objective-c swift realm

我有一个托管Avatar类和一个托管User类。 User类引用了Avatar类:

@interface User : RLMObject
...
@property (nonatomic, retain) Avatar *avatar;
...

Avatar类看起来像:

@interface Avatar : RLMObject
@property (nonatomic, retain) NSString *urlStr;
@property (nonatomic, retain) NSData *imageData;
@end

@implementation Avatar
+ (NSString *)primaryKey {
    return @"urlStr";
}
+ (NSArray *)requiredProperties {
    return @[@"urlStr", @"imageData"];
}
@end

有些情况下,我已经获取了一个新用户(例如,来自服务器)但是为了避免重新下载头像,我想从数据库中获取现有的用户。看起来很简单,但在从db(使用Avatar)获取现有[Avatar objectWithPrimaryKey]引用并将其设置为User上的头像属性后,当我在addOrUpdateObject上调用avatar时领域,User属性设置为nil。没有异常抛出或调试日志,属性只是从非零到零。确实Avatar引用在数据库中是空的,尽管仍然填充了 if let avatarURLStr = user.avatarURLStr, let avatarURL = URL(string: avatarURLStr) { if let dbAvatar = Avatar(forPrimaryKey: avatarURLStr) { let newAvatar = Avatar(urlStr: dbAvatar.urlStr, imageData: dbAvatar.imageData) user.avatar = newAvatar } else { if let data = NSData(contentsOf: avatarURL) { let avatar = Avatar(urlStr: avatarURLStr, imageData: data as Data!) user.avatar = avatar } } } 表。

部分代码:

检查现存的头像:

            let realm = RLMRealm.default()
            realm.beginWriteTransaction()
            // user.avatar is non-nil here
            realm.addOrUpdate(user)
            // user.avatar is nil here
            try? realm.commitWriteTransaction()

将用户添加到db:

tsconfig.json

我正在使用Realm 2.1.1 for Objective-C(但该项目同时使用Swift和Obj-C)。

1 个答案:

答案 0 :(得分:2)

Oy ......明白了。我对这个问题进行了简化,结果发现我正在更新的其中一个对象与另一个与另一个具有头像的对象有关系的对象有关系。那个化身是零。