【问题标题】:Why would Realm addOrUpdateObject cause a property to get set to nil?为什么 Realm addOrUpdateObject 会导致属性设置为零?
【发布时间】:2016-12-08 00:17:44
【问题描述】:

我有一个托管的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

在某些情况下,我已经获取了一个新用户(例如,从服务器),但为了避免重新下载头像,我想从数据库中获取现有用户。看起来很简单,但是在从数据库中获取现有的Avatar 引用(使用[Avatar objectWithPrimaryKey])并将其设置为User 上的头像属性后,当我在Realm 上调用addOrUpdateObject 时,avatar 属性得到设置为零。没有抛出异常或调试日志,该属性只是从非零变为零。果然User 引用在数据库中是空的,尽管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()

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

【问题讨论】:

  • 我还想知道添加或更新引用托管对象的非托管对象是否可以。我实际上已经尝试过创建一个不受管理的新 Avatar 对象并添加或更新该对象,但我遇到了完全相同的问题。

标签: ios objective-c swift realm


【解决方案1】:

Oy...想通了。我稍微简化了问题,结果发现我正在更新的一个对象与另一个对象有关系,而另一个对象又与另一个具有头像的对象有关系。而那个头像是零。

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 2011-04-30
    • 2013-05-09
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多