核心数据主键

Mug*_*nth 77 iphone cocoa-touch core-data

这可能看起来很愚蠢,但我仍然无法弄清楚如何将属性标记为xcdatamodel文件中的主键.我的持久存储是sqlite文件.谁能帮我?

在这种情况下,我如何"验证"ID是唯一的?我应该写一个验证方法吗?

Mik*_*lah 89

你的选择是:

  • 使用-[NSManagedObject objectID].请注意,此ID是临时的,直到第一次保存对象或您调用-[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
  • 使用CFUUID函数族为-awakeFromInsert方法中的每个对象生成UUID
  • 创建您自己的类似主键的系统,该系统在模型中存储一个整数,并通过创建每个对象来增加它

没有好的方法来验证属性是否唯一.您最接近的是确保它在创建时是唯一的,然后实现一个自定义的setter方法,阻止任何人更改ID.

  • 一个更具建设性的答案 - 你应该被标记为解决方案! (5认同)

Mar*_*eau 44

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

  • 这应该是@Mugunth应该选择的答案!感谢您的见解. (2认同)

Pau*_*lin 21

核心数据创建自己的主键 - 您不必添加一个.你可以用它来检索它

NSManagedObjectID *moID = [managedObject objectID];
Run Code Online (Sandbox Code Playgroud)


kit*_*ter 14

有时当黑客攻击时需要主键的实际int.这是人们如何抓住它:

NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID];
int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue];
Run Code Online (Sandbox Code Playgroud)

尽管CoreData是一个对象图,但如果查看CoreData生成的SQLite数据库数据,这种获取NSManagedObject主键的方法应该不是问题.ii已将CoreData和低级sqlite3 C库一起使用在相同的代码中,并将主键从CoreData传递到sqlite3以获取记录工作正常.

!如果您打算在生产中使用此代码,请注意db主键转换为URIRepresentation的方式可能会发生内部更改,这可能会使您的代码失效.

请享用

  • 为了速度和效率,sql有时是要走的路.我的例子,一个包含计数(*),总和,平均值和组的查询.它是OO中的PAIN,sql的单行!那个'hack'工作得很好,如果Apple改变它,那么他们仍然必须以某种方式使sql join工作,所以我想我们可以暂时一段时间;).即使理论上我们不应该这样做,也要投票.在我看来,完全隐藏数据库是一个错误,更多的是由原则驱动而不是真正的技术原因.我们这样做,通过SQL获得批处理.尽管有一个框架可用,但在许多其他系统中仍然存在. (2认同)