【发布时间】:2010-10-28 10:46:12
【问题描述】:
这可能看起来很愚蠢,但我仍然不知道如何在 xcdatamodel 文件中将属性标记为主键。 我的持久存储是 sqlite 文件。 谁能帮帮我?
在这种情况下,我如何“验证”一个 ID 是唯一的? 我应该写一个验证方法还是什么?
【问题讨论】:
标签: iphone cocoa-touch core-data
这可能看起来很愚蠢,但我仍然不知道如何在 xcdatamodel 文件中将属性标记为主键。 我的持久存储是 sqlite 文件。 谁能帮帮我?
在这种情况下,我如何“验证”一个 ID 是唯一的? 我应该写一个验证方法还是什么?
【问题讨论】:
标签: iphone cocoa-touch core-data
您的选择是:
-[NSManagedObject objectID]。请注意,此 ID 是临时的,直到第一次保存对象或您调用 -[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
CFUUID 系列函数为-awakeFromInsert 方法中的每个对象生成一个UUID没有很好的方法来验证属性是否唯一。您将得到的最接近的方法是确保它在创建时是唯一的,然后实现一个自定义的 setter 方法来阻止任何人更改 ID。
【讨论】:
请记住,Core Data 是一个对象图持久性框架,而不是数据库。像主键这样的东西被抽象出来了,因为它们依赖于持久存储的实现。
【讨论】:
Core Data 有自己的主键——您不必添加主键。您可以使用检索它
NSManagedObjectID *moID = [managedObject objectID];
【讨论】:
有时当黑客需要主键的实际 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 的方式可能发生的内部更改,它可能会破坏您的代码。
享受
【讨论】:
无需破解 NSManagedObjectID,您就可以在管理远程数据收集之前快速检查您的属性。
我做了一个实用方法,check it here
【讨论】:
用于检索主键的 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)...])
}
}
【讨论】:
我宁愿使用时间 + 类名作为唯一标识符。
【讨论】: