这可能看起来很愚蠢,但我仍然无法弄清楚如何将属性标记为xcdatamodel文件中的主键。 我的持久存储是sqlite文件。 任何人都可以帮助我吗?
在这种情况下,我如何“验证”ID是唯一的? 我应该写一个验证方法吗?
答案 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作为唯一标识符。