核心数据主键

时间:2009-05-23 14:44:27

标签: iphone cocoa-touch core-data

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

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

7 个答案:

答案 0 :(得分:87)

您的选择是:

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

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

答案 1 :(得分:43)

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

答案 2 :(得分:20)

Core Data制作自己的主键 - 您不必添加一个。您可以使用

检索它
NSManagedObjectID *moID = [managedObject objectID];

答案 3 :(得分:14)

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

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

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

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

享受

答案 4 :(得分:0)

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

我做了一个实用工具方法check it here

答案 5 :(得分:0)

用于检索主键的Swift扩展

extension NSManagedObject {
    var primaryKey : String {
        guard objectID.uriRepresentation().lastPathComponent.count > 1 else { return "" }
        return objectID.uriRepresentation().lastPathComponent.substring(from: 1)
    }
}

对于字符串

extension String
{
    func substring(from : Int) -> String {
        guard self.count > from else { return "" }
        return String(self[self.index(self.startIndex, offsetBy: from)...])
     }
}

答案 6 :(得分:-3)

我宁愿使用Time + Class name作为唯一标识符。