2015-05-24 3 views
14

Ho testato principalmente utilizzando iPhone 6, 6 plus e iPad. Ho appena provato la mia app oggi sul simulatore di iPhone 5 e ho ricevuto un errore di Core Data.Dati principali Errore scalare solo su alcuni dispositivi

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

Ora, non v'è alcun oggetto 'setId' nella mia app, ma ovviamente l'entità ha un oggetto 'ID', che è impostato come un int.

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

Nel modello Dati di base, il tipo di attributo è impostato su Numero intero64. Questo potrebbe essere il mio problema, perché l'ho scelto senza sapere cosa fosse meglio. Ho altri attributi nel modello e nella classe, ma sono tutti archi.

Alla ricerca di una correzione e una spiegazione del motivo per cui questo accade solo su alcuni dispositivi, quindi posso imparare!

risposta

27

Se il tipo di dati di base è un numero intero 64, è necessario dichiarare la proprietà come Int64 (o lasciare che Xcode crei la sottoclasse dell'oggetto gestito).

Int può essere a 32 bit o 64 bit, a seconda dell'architettura del processore.

In alternativa, definire la proprietà come NSNumber* anziché una proprietà scalare. Naturalmente è necessario fare attenzione che su una piattaforma a 32 bit i valori non superino l'intervallo di Int.

+0

Ho fatto in modo che Xcode creasse la classe, ma successivamente ho aggiunto l'ID. Inoltre, se imposto la proprietà su Int64, devo convertire tutto il mio codice quando provo a inserire i dati in questa proprietà. C'è un modo per rendere invece il modello match Int? – Tim

+1

@Tim: Core Data ha solo numeri interi fissi (16, 32, 64 bit). –

+0

Lo vedo. Quindi non c'è modo di usare Int su tutto il mio codice e quindi convertirlo in una dimensione salvando su CD? Sicuramente grato per i chiarimenti, stavo solo cercando una soluzione più universale. – Tim

1

In alternativa, è possibile scrivere il proprio metodo setter/getter che trasforma il Int in un'istanza NSNumber e passa questo sul il valore di base . Es .:

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