我注意到,设置PK在领域中不是必须的,可以省略.但在文件中声明:

为主键属性自动创建索引.

我想澄清一些问题:

1)如果不是我自己分配,那么PK的默认值是什么,是根据领域定义的.这是哈希还是怎么的?(如果我不设置PK并拨打[MyRealmObject primaryKey],则返回nil)

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

3) 每次为每RLMObject个子类定义PK是一种好的做法,还是对Realm来说它不是必需的,仅仅依赖于Realm本身定义的内部实现?

推荐答案

(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 不使用它们,仍然不需要有主键.

Database相关问答推荐

嵌入式的 best数据库是什么?

实体关系图. IS A 关系如何转换为table表?

仅对表中的一列授予更改

如何手动卸载 Oracle?

android 应用程序与 web 服务通信的安全性

多少个外键才算太多?

用于存储年份的 MySQL 类型:Smallint 或 Varchar 或 Date?

Oracle 和 SQL Server 中的 NVARCHAR 之间的区别?

是否有任何用于 NoSQL 数据库架构迁移的工具?

什么是本体数据库?

按最强 LIKE 排序 SQL?

SOA 和共享数据库

xtradb vs innodb

找不到类型或命名空间名称SQLConnection

PDO SQL 状态00000但仍然错误?

从原始物理文件中恢复 postgreSQL 数据库

在 SQLite 表中使用文本作为主键不好?

从数据库中获取事件

多币种 - 存储什么以及何时转换?

数据库效率 - 每个用户的表与用户表