gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 08:09:10 44 4
gpt4 key购买 nike

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

Indexes are created automatically for primary key properties.

我想澄清一些问题:

1)PK的默认值是多少是Realm定义的,如果我不自己赋值的话。它是散列还是什么? (如果我不设置 PK 并调用 [MyRealmObject primaryKey] 它返回 nil)

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

3) 每次为每个 RLMObject 子类定义 PK 是否是一个好习惯,或者它对于 Realm 来说不是必需的,并且可能仅仅依赖于 Realm 本身定义的内部实现?

最佳答案

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

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

回答您的问题:

1) 没有默认值;您将自己的属性之一指定为主键。 primaryKey 默认返回 nil,因为您需要自己覆盖它以向 Realm 指示您希望将哪个属性用作主键。一些用户将整数设置为主键,但通常情况下,使用 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

希望对您有所帮助!

附录:为了详细说明下面的一些评论,对于任何根据数据库中是否已存在具有相同键的对象来更改其功能的 Realm API,主键是明确必需的。例如,如果具有该主键的对象不存在,+[RLMObject createOrUpdateInRealm:] 将向数据库添加一个新的 Realm 对象,否则将简单地更新现有对象。

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

关于ios - 我应该为 Realm 中的每个实体定义主键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32322460/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com