iOS >> CoreData >> 我应该创建一个 ID 属性还是可以使用 SQLite 对象 ID?

Posted

技术标签:

【中文标题】iOS >> CoreData >> 我应该创建一个 ID 属性还是可以使用 SQLite 对象 ID?【英文标题】:iOS >> CoreData >> Should I Create an ID Attribute or Can I Use the SQLite Object ID? 【发布时间】:2013-10-08 10:21:20 【问题描述】:

使用 CoreData 时,我是否需要创建一个 ID 属性来为每条记录设置某种唯一键,或者我可以访问表中每一行的数据库 ID 字段吗?

如果有使用 DB ID 字段的方法,我将不胜感激在通过 managedObject 实例保存记录时如何获取它的一些指导...

【问题讨论】:

【参考方案1】:

通常不需要创建 id 属性,因为每个对象都有一个对象 ID (NSManagedObjectID)。如果您有一个托管对象,您可以通过向它发送 -objectID 来获取它的 ID。不过有一个问题:

有个问题:NSManagedObjectID 可以是临时的也可以是永久的。创建对象时,它具有一个临时 ID,直到您获得该对象的永久 ID。当你持久化一个对象时,Core Data 会自动为每个仍然有临时 ID 的对象获取一个永久 ID。

如果您需要自定义 ID 属性,您应该为每个实体单独创建它。不要创建具有 ID 属性的抽象实体。如果你这样做,Core Data 将为从抽象实体继承的所有实体创建一个巨大的(怪物)表。这很糟糕。

【讨论】:

【参考方案2】:

NSManagedObjects 有一个对象 id 属性。但是当你创建一个 ManagedObject 时会有一个临时 id,在将对象存储到 DB 之后它将获得永久 id。根据我的经验,最好为每个数据创建自己的 id。例如,如果它是一个简单的表,您可以简单地使用时间戳作为唯一 ID,或者如果它是一个具有实时和频繁更新的复杂表,您应该使用表中的字段与时间戳的某种组合(您可以将值转换为base64 使其成为真实的 id ;) )。

【讨论】:

【参考方案3】:

Apple 建议不要访问 Core Data 创建的 SQLite 文件,因为它的格式将来可能会改变。遵循此规则,您应该创建自己的 ID。

还有一个NSManagedObject - objectID,但我不确定你的用例是什么以及是否应该使用它。

【讨论】:

以上是关于iOS >> CoreData >> 我应该创建一个 ID 属性还是可以使用 SQLite 对象 ID?的主要内容,如果未能解决你的问题,请参考以下文章

在CoreData ios swift3中只获取表的几个属性

CoreDataManager-OC版-兼容iOS10以前的版本

ios开发之CoreData使用

Playground 你不知道的小技巧, CoreData 的使用

Playground 你不知道的小技巧, CoreData 的使用

Coredata 单表简单使用