RLMArray一对多关系中的重复对象

时间:2015-12-05 22:55:15

标签: ios objective-c realm

没有我的领域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调试区域的截图

Realm browser Xcode debug area

这里有3只狗,因为我的代码运行了3次,但没关系,我可以用我的Id制作狗,但在这种情况下没关系

custom ids

2 个答案:

答案 0 :(得分:3)

RLMArray具有数组语义。它的行为不像一个集合,它只包含唯一的对象。这意味着您可以多次添加同一个对象。如果你想在最后只有一个每种类型的对象,你应该只添加一个对象。

您发布的调试器的输出表明您运行了3次应用程序,但狗每次都有不同的ID,因此它们被威胁为不同的对象。

如果您使用[Person createOrUpdateInRealm:realm withValue:jim];,其中jimNSDictionary或只有一只狗的独立对象,并且该狗的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 ,如果你先分开坚持这些狗,然后将它添加到一个人(一对多),你就不会我不再有问题了,因为在分别坚持狗时,王国会首先抛出异常。