2015-05-24 13 views
14

Testowałem głównie przy użyciu iPhone'a 6, 6 plus i iPada. Właśnie wypróbowałem moją aplikację dzisiaj na symulatorze iPhone'a 5 i otrzymałem błąd Core Data.Błąd Core Data Scalar tylko na niektórych urządzeniach

CoreData: error: Property 'setId:' is a scalar type on class 'AppName.EntityName' that does not match its Entity's property's scalar type. Dynamically generated accessors do not support implicit type coercion. Cannot generate a setter method for it

Teraz nie ma żadnego obiektu „setId” w mojej aplikacji, ale oczywiście jednostka ma obiektu „ID”, który jest ustawiony jako int.

class Entity: NSManagedObject { 
    @NSManaged var id: Int 
} 

W modelu danych podstawowych typem atrybutu jest Integer64. To może być mój problem, ponieważ wybrałem to, nie wiedząc, co jest najlepsze. Mam inne atrybuty w modelu i klasie, ale wszystkie są ciągami.

Szukam zarówno poprawki, jak i wyjaśnienia, dlaczego tak się dzieje tylko na niektórych urządzeniach, więc mogę się uczyć!

Odpowiedz

27

Jeśli typem danych podstawowych jest liczba całkowita 64, należy zadeklarować właściwość jako Int64 (lub pozwolić Xcode utworzyć podklas obiektu zarządzanego).

może mieć 32 lub 64 bity, w zależności od architektury procesora.

Alternatywnie, zdefiniuj właściwość jako NSNumber* zamiast właściwości skalarnej. Oczywiście musisz uważać, aby na 32-bitowej platformie wartości nie przekraczały zakresu Int.

+0

Pozwoliłem Xcode utworzyć klasę, ale później dodałem identyfikator później. Ponadto, jeśli ustawię właściwość na Int64, muszę przekonwertować cały mój kod, gdy próbuję wprowadzić dane do tej właściwości. Czy istnieje sposób, aby zamiast tego model pasował do Int? – Tim

+1

@Tim: Dane podstawowe mają tylko stałe liczby całkowite (16, 32, 64-bitowe). –

+0

Widzę to. Więc nie ma sposobu na użycie Int przez cały mój kod, a następnie konwersję do jednego rozmiaru przy zapisywaniu na CD? Zdecydowanie wdzięczny za wyjaśnienia, po prostu szukałem bardziej uniwersalnego rozwiązania. – Tim

1

Alternatywnie, można napisać swoją własną metodę setter/getter, który przemienia Int na przykład NSNumber i przechodzi to na wartości, prymitywnego. Np .:

private(set) var publicId: Int { 
    get { 
    self.willAccessValueForKey("publicId") 
    let value = self.primitivePublicId.longValue 
    self.didAccessValueForKey("publicId") 
    return value 
    } 
    set { 
    self.willChangeValueForKey("publicId") 
    self.primitivePublicId = NSNumber(long: newValue) 
    self.didChangeValueForKey("publicId") 
    } 
} 
@NSManaged private  var primitivePublicId: NSNumber