이것은 어리석은 것처럼 보일 수 있지만 xcdatamodel 파일에서 속성을 기본 키로 표시하는 방법을 알아낼 수 없었습니다. 내 영구 저장소는 sqlite 파일입니다. 누구든지 나를 도울 수 있습니까?
이 경우 고유 한 ID를 "확인"하려면 어떻게해야합니까? 유효성 검사 방법이나 뭔가를 작성해야합니까?
답변:
옵션은 다음과 같습니다.
-[NSManagedObject objectID]
. 이 ID는 개체가 처음으로 저장되거나 다음을 호출 할 때까지 임시입니다.-[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
CFUUID
함수 패밀리를 사용 하여 -awakeFromInsert
메서드의 각 개체에 대한 UUID를 생성합니다.속성이 고유한지 확인하는 좋은 방법은 없습니다. 가장 가까운 방법은 생성시 고유한지 확인한 다음 ID를 변경하는 모든 사람을 중지하는 사용자 지정 setter 메서드를 구현하는 것입니다.
Core Data는 데이터베이스가 아니라 객체 그래프 지속성 프레임 워크입니다. 기본 키와 같은 것은 영구 저장소의 구현에 의존하기 때문에 추상화됩니다.
Core Data는 자체 기본 키를 만듭니다. 추가 할 필요가 없습니다. 다음으로 검색 할 수 있습니다.
NSManagedObjectID *moID = [managedObject objectID];
때로 해킹 할 때 기본 키의 실제 정수가 필요합니다. 다음은 그것을 잡을 수있는 방법입니다.
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으로 변환되는 방식에 대한 가능한 내부 변경 사항을 인식하면 코드가 중단 될 수 있습니다.
즐겨
기본 키를 검색하는 Swift Extension
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)...])
}
}
차라리 시간 + 클래스 이름을 고유 식별자로 사용하고 싶습니다.