我应该为Realm中的每个实体定义主键吗?

我注意到设置PK在Realm中不是强制性的,只是可以省略。 但是在文档中指出:

索引是为主键属性自动创build的。

我想澄清一些问题:

1)如果我没有自己分配,那么PK的缺省值是由Realm定义的。 它是散列或什么的? (如果我不设置PK并调用[MyRealmObject primaryKey]则返回nil

2)如果这个隐式PK是默认索引的? 我是否应该担心,因为如果它没有被索引,这是否意味着它会影响这个实体的整体性能(例如,获取对象)?

3)每次为每个RLMObject子类定义PK还是不需要Realm,并且可能只依赖Realm本身定义的内部实现?

(免责声明:我为Realm工作。)

是的! 在Realm中设置主键不是强制性的,也不是必须的,这就是为什么完全由开发人员和应用程序的要求来决定是否需要实现的原因。

回答你的问题:

1)没有默认值; 您指定您自己的一个属性作为主键。 primaryKey默认返回nil,因为您需要自己重写,以便向Realm指示要作为主键的属性。 一些用户将整数设置为主键,但通常使用UUIDstring的情况最为常见。

2)没有隐含的主键。 您必须使用[RLMObject primaryKey]方法明确指出哪个属性是主键,然后将其索引。 🙂

3)在我自己的(业余时间)开发经验中,通常我发现使用主键可以更容易地识别和处理特定的对象。 例如,如果你要跨线程传递一个对象,你可以简单地传递主键值,并使用[RLMObject objectForPrimaryKey:]来重新获取对象。 显然这取决于你自己的实现要求。 你可能不应该添加一个主键,除非你发现你真的需要一个。

作为一个例子,如果你想设置一个UUIDstring作为主键,这里是你要添加到你的RLMObject子类的东西:

 @interface MyObject : RLMObject @property NSString *uuid; @end @implementation MyObject + (NSString *)primaryKey { return @"uuid"; } + (NSDictionary *)defaultPropertyValues { @{@"uuid": [[NSUUID UUID] UUIDString]}; } @end 

我希望有帮助!

附录:为了详细说明下面的一些注释,对于任何改变其function的Realm API来说,主键是明确必要的,这取决于数据库中是否存在具有相同关键字的对象。 例如+[RLMObject createOrUpdateInRealm:]将添加一个新的Realm对象到数据库,如果一个具有该主键的对象不存在的话,将会简单的更新现有的对象。

因此,在主键是后续逻辑的关键组件的这些情况下,它们是必需的。 但是,由于这些API是在Realm中添加/更新数据的不同方式的一个子集,如果您select不使用它们,您仍然不需要有主键。

马已经被打死了,但是我忍不住引用了如果Realm对象被创build或更新而不具有主键则引发exception的领域代码。

 + (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value { // verify primary key RLMObjectSchema *schema = [self sharedSchema]; if (!schema.primaryKeyProperty) { NSString *reason = [NSString stringWithFormat:@"'%@' does not have a primary key and can not be updated", schema.className]; @throw [NSException exceptionWithName:@"RLMExecption" reason:reason userInfo:nil]; } return (RLMObject *)RLMCreateObjectInRealmWithValue(realm, [self className], value, true); } 
Interesting Posts