(Disclaimer: I work for Realm.)个
是啊!在领域中设置主键不是强制性的,也不是必要的,这就是为什么在实现中是否需要完全取决于开发人员和应用程序的要求.
回答您的问题:
1)没有默认值;您可以指定您自己的属性之一作为主键.默认情况下,primaryKey
返回nil,因为您需要自己覆盖它,以便向领域表明您希望将哪个属性作为主键.一些用户将整数设置为主键,但通常使用UUID字符串是最常见的.
2) 没有隐式主键.必须使用[RLMObject primaryKey]
方法明确说明哪个属性是主键,然后它将被索引.:)
3)在我自己(业余时间)的开发经验中,我通常发现拥有主键使识别和处理特定对象变得容易得多.例如,如果要跨线程传递对象,只需传递主键值并使用[RLMObject objectForPrimaryKey:]
重新获取该对象即可.显然,这取决于您自己的实现要求.您可能不应该添加主键,除非您发现确实需要一个主键.
例如,如果您希望将UUID字符串设置为主键,下面是要添加到RLMObject子类的内容:
@interface MyObject : RLMObject
@property NSString *uuid;
@end
@implementation MyObject
+ (NSString *)primaryKey
{
return @"uuid";
}
+ (NSDictionary *)defaultPropertyValues
{
@{@"uuid": [[NSUUID UUID] UUIDString]};
}
@end
我希望这有帮助!
Addendum:为了详细说明下面的一些 comments ,主键对于任何领域API都是明确必需的,这些领域API根据数据库中是否已经存在具有相同键的对象来更改其功能.例如,如果带有主键的对象不存在,+[RLMObject createOrUpdateInRealm:]
将向数据库中添加一个新的领域对象,否则只会更新现有对象.
因此,在主键是后续逻辑的关键组件的这些实例中,它们是必需的.但是,由于这些API是在领域中添加/更新数据的不同方式的子集,因此如果您 Select 不使用它们,仍然不需要有主键.