核心数据主键

这可能看起来很愚蠢,但我仍然不知道如何将属性标记为xcdatamodel文件中的主键。 我的持久性存储是sqlite文件。 任何人都可以帮我吗?

在这种情况下,我如何“validation”一个ID是唯一的? 我应该写一个validation方法什么的?

您的select是:

  • 使用-[NSManagedObject objectID] 。 请注意,这个ID是暂时的,直到对象被第一次保存,或者你调用-[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
  • 使用CFUUID系列函数为-awakeFromInsert方法中的每个对象生成一个UUID
  • 创build您自己的主键系统,在您的模型中存储一个整数,并通过创build每个对象来增加整数

没有好的方法来validation一个属性是唯一的。 您将得到最接近的是确保它在创build时是唯一的,然后实现自定义setter方法,以阻止任何人更改ID。

请记住,Core Data是一个对象图持久化框架,而不是数据库。 像主键这样的东西被抽象掉,因为它们依赖于持久存储的实现。

核心数据使自己的主键 – 你不必添加一个。 你可以检索它

 NSManagedObjectID *moID = [managedObject objectID]; 

有时候黑客需要主键的实际整数。 这里是如何抓住它:

 NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID]; int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue]; 

尽pipeCoreData是一个对象图,但是如果查看CoreData生成的SQLite数据库数据,这种抓取NSManagedObject主键的方式应该不成问题。 ii在相同的代码中一起使用了CoreData和低级别的sqlite3 C库,并且将主键从CoreData传递到sqlite3以获取logging工作得很好。

! 如果您打算在生产中使用此代码,请注意可能的内部更改方式的数据库主键转换为URIRepresentation,它可能会制动您的代码。

请享用

在不pipe理NSManagedObjectID的情况下,您可以在pipe理远程数据收集之前快速检查您的属性。

我已经做了一个实用的方法, 在这里检查

我宁愿使用时间+类名作为唯一标识符。