Może się to wydawać głupie, ale nadal nie mogłem wymyślić, jak oznaczyć atrybut jako klucz podstawowy w pliku xcdatamodel. Moja pamięć trwała to plik sqlite. Czy ktoś może mi pomóc?
W takim przypadku, jak mogę „sprawdzić”, czy identyfikator jest unikalny? Powinienem napisać metodę walidacji czy coś?
iphone
cocoa-touch
core-data
Mugunth
źródło
źródło
Należy pamiętać, że Core Data jest strukturą trwałości grafów obiektów, a nie bazą danych. Rzeczy takie jak klucze podstawowe są abstrakcyjne, ponieważ zależą od implementacji magazynu trwałego.
źródło
Dane podstawowe tworzą własny klucz podstawowy - nie musisz go dodawać. Możesz go odzyskać za pomocą
NSManagedObjectID *moID = [managedObject objectID];
źródło
czasami podczas hakowania potrzebny jest faktyczny int klucza podstawowego. oto jak można to złapać:
NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID]; int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue];
pomimo tego, że CoreData jest grafem obiektowym, jeśli spojrzy się na dane bazy danych SQLite wygenerowane przez CoreData, ten sposób przechwycenia klucza podstawowego NSManagedObject nie powinien stanowić problemu. ii użyłem CoreData i niskopoziomowej biblioteki sqlite3 C razem w tym samym kodzie, a przekazywanie kluczy podstawowych z CoreData do sqlite3 w celu pobrania rekordów działa dobrze.
! Jeśli zamierzasz używać tego kodu w środowisku produkcyjnym, pamiętaj o możliwych zmianach wewnętrznych w sposobie, w jaki klucz podstawowy db przekształca się w prezentację URIR, może to spowodować uszkodzenie Twojego kodu.
cieszyć się
źródło
Bez hakowania NSManagedObjectID możesz przeprowadzić szybkie sprawdzenie atrybutu przed zarządzaniem zdalnym gromadzeniem danych.
Zrobiłem metodę użytkową, sprawdź to tutaj
źródło
Szybkie rozszerzenie do pobierania klucza podstawowego
extension NSManagedObject { var primaryKey : String { guard objectID.uriRepresentation().lastPathComponent.count > 1 else { return "" } return objectID.uriRepresentation().lastPathComponent.substring(from: 1) } }
I dla String
extension String { func substring(from : Int) -> String { guard self.count > from else { return "" } return String(self[self.index(self.startIndex, offsetBy: from)...]) } }
źródło
Wolałbym raczej użyć Time + the Class name jako unikalnego identyfikatora.
źródło