我有一个托管的 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
属性设置为 nil。没有抛出异常或调试日志,该属性只是从非零变为零。果然 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)。
最佳答案
哦……我明白了。我稍微简化了问题的内容,结果发现我正在更新的对象之一与另一个对象有关系,而另一个对象与另一个具有化身的对象有关系。而那个头像是零。
关于ios - 为什么 Realm addOrUpdateObject 会导致属性设置为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41029669/