これはばかげているように見えるかもしれませんが、xcdatamodelファイルで属性を主キーとしてマークする方法を理解できませんでした。私の永続ストレージはsqliteファイルです。誰か助けてもらえますか?
その場合、IDを一意に「検証」するにはどうすればよいですか?検証方法か何かを書くべきですか?
回答:
オプションは次のとおりです。
-[NSManagedObject objectID]
ます。このIDは、オブジェクトが初めて保存されるか、呼び出すまで一時的なものであることに注意してください。-[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
CFUUID
関数ファミリーを使用して、-awakeFromInsert
メソッド内の各オブジェクトのUUIDを生成しますプロパティが一意であることを検証する良い方法はありません。最も近い方法は、作成時に一意であることを確認してから、IDを変更することのないカスタムセッターメソッドを実装することです。
CoreDataは独自の主キーを作成します。追加する必要はありません。あなたはそれを取得することができます
NSManagedObjectID *moID = [managedObject objectID];
ハッキングするときに、主キーの実際の整数が必要になることがあります。これがそれをつかむ方法です:
NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID];
int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue];
CoreDataはオブジェクトグラフですが、CoreDataで生成されたSQLiteデータベースデータを見ると、NSManagedObjectの主キーを取得するこの方法は問題になりません。iiは同じコードでCoreDataと低レベルのsqlite3Cライブラリを一緒に使用しており、レコードをフェッチするためにCoreDataからsqlite3に主キーを渡すことは問題なく機能します。
!このコードを本番環境で使用する場合は、dbプライマリキーがURIRepresentationに変換される方法に内部変更が加えられる可能性があることに注意してください。これにより、コードが破損する可能性があります。
楽しい
主キーを取得するための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)...])
}
}
一意の識別子として時間+クラス名を使用したいと思います。