没有我的领域db我有问题。我有这些对象:
NSDate: timeToday // "2015-12-05 14:00:00 +0000"
NSDate: currentTime // "2015-12-05 22:46:54 +0000"
当我做这个时,我会在Person.dogs中得到2个相同的对象
// Person.h
@interface Person : RLMObject
//... property declarations
@property RLMArray<Dog *><Dog> *dogs;
@end
// Dog.h
@interface Dog : RLMObject
@property NSInteger id;
@property NSString *name;
@end
RLM_ARRAY_TYPE(Dog) // Defines an RLMArray<Dog> type
// Dog.m
@implementation Dog
+ (NSString *)primaryKey {
return @"id";
}
@end
在此之后我应该做什么我将只有一个具有唯一主键的对象?我知道RLMArray只是一个数组,但是我认为早期我认识到一对多关系只有唯一对象。
以下是Realm浏览器和Xcode调试区域的截图
这里有3只狗,因为我的代码运行了3次,但没关系,我可以用我的Id制作狗,但在这种情况下没关系
答案 0 :(得分:3)
RLMArray
具有数组语义。它的行为不像一个集合,它只包含唯一的对象。这意味着您可以多次添加同一个对象。如果你想在最后只有一个每种类型的对象,你应该只添加一个对象。
您发布的调试器的输出表明您运行了3次应用程序,但狗每次都有不同的ID,因此它们被威胁为不同的对象。
如果您使用[Person createOrUpdateInRealm:realm withValue:jim];
,其中jim
是NSDictionary
或只有一只狗的独立对象,并且该狗的ID等于ids持续存在于你的王国,那么你最终仍然只有一个人和一只狗,他们剩下的所有属性都会有更新的值。
答案 1 :(得分:0)
我认为这是因为你还没有坚持下去。
如果使用相同的主键保留RLMObjects,则realm将抛出异常(因为主键)。
// Update or create jim with with the dogs
[realm beginWriteTransaction];
[Person createOrUpdateInRealm:realm withValue:jim];
[realm commitWriteTransaction];
// Or add Jim with the dogs to Realm with transaction
[realm beginWriteTransaction];
[realm addObject:jim];
[realm commitWriteTransaction];
编辑:我同意 Marius ,如果你先分开坚持这些狗,然后将它添加到一个人(一对多),你就不会我不再有问题了,因为在分别坚持狗时,王国会首先抛出异常。