2010-08-06 8 views
6
if (win) { 
    // Game was won, set completed in puzzle and time 
    // Calculate seconds taken 
    int timeTaken = (int)([NSDate timeIntervalSinceReferenceDate] - self.gameStartTime); 
    int bestTime = [[self.puzzle valueForKey:@"bestTime"] intValue]; 
    if (timeTaken < bestTime && bestTime != 0) { 
     [self.puzzle setValue:[NSNumber numberWithInt:timeTaken] forKey:@"bestTime"]; 
     NSLog(@"Best time for %@ is %@", [self.puzzle valueForKey:@"name"], [self.puzzle valueForKey:@"bestTime"]); 
    } 
} 

Questo è un codice da un gioco per iPad che sto creando e sto utilizzando Core Data per l'archiviazione dei livelli. Quando un livello è completato e vinto, voglio impostare il miglior tempo per quel livello. Il tempo impiegato viene calcolato e, se è migliore del tempo migliore precedente, voglio impostarlo come il momento migliore per il livello.L'entità non è la chiave di codifica del codice compatibile

Questo codice non riesce sulla riga 'int bestTime' quando tenta di recuperare il tempo migliore da self.puzzle che è un NSManagedObject di Core Data. Il tempo migliore viene memorizzato come numero intero 32 nel modello Core Data. Non riesce con un errore SIGABRT.

'[<NSManagedObject 0x95334d0> valueForUndefinedKey:]: the entity Puzzle is not key value coding-compliant for the key "bestTime".' 

Ho cercato on-line per i motivi per cui questo sta accadendo e come risolvere il problema, ma nulla sembra essere aiutato. Ci sono altri posti in cui accedo ai valori Integer dal modello Core Data e funzionano perfettamente, sebbene siano usati per filtrare e ordinare le query.

Inoltre non so se la linea in cui imposto il valore funzionerà.

Qualsiasi aiuto su questo sarebbe molto apprezzato.

MODIFICA: questo è il codice che recupera una serie di puzzle di cui uno è considerato il puzzle precedente.

// Define our table/entity to use 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Puzzle" inManagedObjectContext:managedObjectContext]; 

// Setup the fetch request 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 

// Set the filter for just the difficulty we want 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"difficulty == %d", difficulty]; 
[request setPredicate:predicate]; 

// Define how we will sort the records 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sortid" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 

// Fetch the records and handle an error 
NSError *error; 
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
+0

È "bestTime" una proprietà aggiunta al modello in un momento successivo? Cioè questo potrebbe essere un problema di migrazione? –

+0

L'ho aggiunto in seguito, ma ho rimosso l'app dal simulatore e l'ho reinstallata. – danpalmer

+0

Ho anche resettato il contenuto e le impostazioni del simulatore e ancora non funziona. Lo stesso errore di prima. – danpalmer

risposta

14

Ok, in primo luogo, vorrei ringraziare tutti coloro che hanno suggerito idee. Forse non mi hanno aiutato a risolvere il problema, ma ho imparato di più su Core Data ed è sempre bene scoprire cosa dovrei controllare quando le cose non funzionano.

Non so davvero quale fosse il problema. Fino a stamattina avevo Xcode aperto per circa 5 giorni e penso che ieri ho aggiunto l'attributo 'bestTime' al modello dati. Posso solo supporre che Xcode sia diventato un po 'instabile durante i 5 giorni e ho pensato che fosse stato salvato quando non lo era. Avevo controllato di aver salvato gli attributi del modello, infatti devo aver controllato 3 o 4 volte e anche la mia abitudine di premere Command + S dopo ogni modifica apportata.

In ogni caso, ho riavviato la mia macchina oggi e quando ho avviato Xcode pochi minuti fa mi sono reso conto che "bestTime" non era nel file del modello. L'ho aggiunto, ripristinato le impostazioni sul simulatore iPad e ha funzionato.

Grazie ancora a tutti per l'aiuto, mi spiace che la soluzione non sia stata più interessante e basata sul codice. Anche se mi fa sentire meglio che il mio codice non è la causa.

+0

Ho visto questo problema molto recentemente e il più delle volte sembra essere causato dal pacchetto di app nel simulatore che conserva un vecchio file .mom da una versione precedente del modello di dati. Per qualche motivo, non viene sempre eliminato quando il modello cambia. Il riavvio della macchina ha portato il simulatore a creare una directory di app completamente nuova, risolvendo così il problema. Anche l'eliminazione dell'app dal simulatore risolverà il problema. – TechZen

+0

Avevo provato a eliminare l'app nel simulatore. Il problema era in realtà con Xcode pensando di aver inserito l'attributo 'bestTime', ma in realtà non l'aveva fatto. – danpalmer

+1

Il riavvio di OS X è stato di aiuto. Grazie. Riavviare Xcode, pulire il codice o eliminare l'app dal dispositivo non ha aiutato. Sul riavvio di Xcode dopo il riavvio di OS X, la differenza del modello era evidente e questa volta si è comportata. Grazie per il suggerimento! –

11

L'oggetto gestito non ha un attributo denominato "bestTime". Secondo il messaggio di eccezione, è sicuramente un Puzzle, quindi non hai dichiarato un attributo chiamato bestTime nel tuo modello (o lo hai scritto in modo errato o lo hai maiuscolato in modo diverso).

+0

Ho definito "bestTime" nel file xcdatamodel nel mio progetto, proprio come tutte le altre cose a cui sto accedendo. Ho provato a copiare e incollare il nome direttamente da quel file. – danpalmer

+0

È sicuramente nella stessa entità a cui stai tentando di accedere? – Joshua

+0

Sì. Ho inserito alcuni log prima della riga che non riesce a stampare altri attributi che so funzionare. Ho confrontato l'output con quello che dovrebbe essere ed è lo stesso modello. – danpalmer

1

Non penso che ci siano abbastanza informazioni qui per determinare la causa. Potresti provare a leggere lo Core Data Troubleshooting Guide; una possibile causa potrebbe essere se inizializzi questa particolare istanza di Puzzle usando init semplice piuttosto che initWithEntity.

+0

Darei un'occhiata a questo. Grazie. Per quanto riguarda l'inizializzazione, non lo so. Ho eseguito una richiesta di recupero sul mio contesto dell'oggetto gestito e ho inserito i risultati in un dizionario mutabile. L'oggetto è appena preso da quello in base al quale viene premuto tableviewcell. – danpalmer

+0

danpalmer: Modifica la tua domanda per includere la richiesta di recupero. –

1

Se è stato aggiunto l'attributo bestTime al modello in un secondo momento, è possibile che si sia dimenticato di inserire dichiarazione e implementazione per la classe oggetto gestito connessa.

Provare le azioni pratiche fornite in Design -> Modello dati -> Copia Obiettivo-C ... Metodo Dichiarazioni/Implementazioni negli Appunti (quando si modifica il file Modello).

+0

Puzzle non è una classe che ho scritto ereditando da NSManagedObject, è solo un NSManagedObject. Da quello che ho letto su Core Data, questo è un modo corretto per farlo se non si dispone di alcun codice che deve essere eseguito sull'oggetto. Per me, è semplicemente una collezione di proprietà. Questo è tutto. – danpalmer

2

Ho risolto lo stesso problema eliminando e creando di nuovo il modello di dati, pulirlo e ricominciare di nuovo. Penso che il bug sia causato dai dati di base che a volte non aggiornano alcuni dati.

0

Se si analizza JSON in un oggetto gestito, assicurarsi di utilizzare la proprietà coreDataPropertyName anziché la chiave json-key-name da JSON. Facile da mescolare quando vengono nominati in modo simile.

Questo errore mi stava facendo impazzire, e tutto perché stavo usando image-url anziché imageURL.

Problemi correlati