2013-02-08 13 views
5

Sto riscontrando un problema grave nel mio database CoreData. Ho creato una relazione da uno a molti tra 2 tabelle e aggiunto una proprietà recuperata nella tabella contenente tutti i valori univoci. Tutto il codice funziona come previsto all'interno di iOS 5, ma in iOS 6 ricevo il seguente errror:Fetched Property funziona in iOS5 ma non in iOS6

2013-02-08 15: 15: 49,382 ArdsBoroughCouncil [16152: c07] * terminazione applicazione a causa di eccezione non identificata ' NSUnknownKeyException ', motivo: ' [< _NSObjectID_48_0 0xb25c3b0> valueForUndefinedKey:]: questa classe è non compatibile con la codifica del valore chiave per la chiave tour_id. ' * primo stack di chiamate tiro: (0x31c7012 0x24a3e7e 0x324ffb1 0x1c445ed 0x1bb08db 0x1bb088d 0x1bceb17 0x1bfe746 0x21b74bb 0x21b7176 0x21b6e44 0x21b66f4 0x21b2d63 0x21b2a82 0x21b2850 0x21b2625 0x21b1e07 0x21b18f4 0x21b0a6d 0x21ae9c9 0x2201276 0x227b155 0x2201071 0x2880014 0x286fd5f 0x286faa3 0x220103b 0x2200e9e 0x21ae9c9 0x2209dfa 0x22375cf 0x2237a03 0x59de1 0x11c2753 0x11c2a7b 0x11d0590 0x11d85bd 0x11d8eab 0x11d94a3 0x11d9098 0x1534da3 0x1526ad9 0x1526b54 0x24b7705 0x10e2920 0x10e28b8 0x11a3671 0x11a3bcf 0x11a2d38 0x111233f 0x1112552 0x10f03aa 0x10e1cf8 0x34b3df9 0x34b3ad0 0x313cbf5 0x313c962 0x316dbb6 0x316cf44 0x316ce1b 0x34b27e3 0x34b2668 0x10df65c 0x291d 0x2845) libC++ abi.dylib : Termina chiamata un'eccezione

Il predicato definito per la proprietà recuperate è:

($ FETCH_SOURCE.tour_id == tour_id) E (! $ FETCH_SOURCE = AUTO)

Ho definito l'array per restituire tutti ricevere tutti i valori all'interno della mia classe Tour.

Sei a conoscenza di problemi con le proprietà recuperate con iOS 6? Come non riesco a capire questo funziona senza alcun problema in iOS 5, ma non riesce in iOS6.

Guarda tutto relativo codice qui sotto:

Il codice che segue è come sto il recupero di tutti i record:

- (void)loadRecordsFromCoreData { 
    [self.managedObjectContext performBlockAndWait:^{ 
     [self.managedObjectContext reset]; 
     NSError *error = nil; 
     NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entityDescription = [NSEntityDescription entityForName:NSStringFromClass([Tour class]) inManagedObjectContext:self.managedObjectContext]; 
     [request setEntity:entityDescription]; 
     [request setResultType:NSManagedObjectResultType]; 
     [request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"tour_id" ascending:YES]]]; 
     self.tours = [self.managedObjectContext executeFetchRequest:request error:&error]; 
    }]; 

Il codice sotto le scarpe NSManagedObjects ho definito:

- Tour

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class TourDetail; 

@interface Tour : NSManagedObject 

@property (nonatomic, retain) NSNumber * tour_id; 
@property (nonatomic, retain) NSString * background_url; 
@property (nonatomic, retain) NSString * summary; 
@property (nonatomic, retain) NSString * title; 
@property (nonatomic, retain) NSSet *tourdetails_tour; 

@property (nonatomic, retain) NSArray *tourDetails; 
@end 

@interface Tour (CoreDataGeneratedAccessors) 

- (void)addTourdetails_tourObject:(TourDetail *)value; 
- (void)removeTourdetails_tourObject:(TourDetail *)value; 
- (void)addTourdetails_tour:(NSSet *)values; 
- (void)removeTourdetails_tour:(NSSet *)values; 

@end 
} 
#import "Tour.h" 
#import "TourDetail.h" 


@implementation Tour 

@dynamic tour_id; 
@dynamic background_url; 
@dynamic summary; 
@dynamic title; 
@dynamic tourdetails_tour; 
@dynamic tourDetails; 

@end 

- Dettaglio tour

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class Tour; 

@interface TourDetail : NSManagedObject 

@property (nonatomic, retain) NSNumber * id; 
@property (nonatomic, retain) NSNumber * tour_id; 
@property (nonatomic, retain) NSNumber * lattitude; 
@property (nonatomic, retain) NSNumber * longitude; 
@property (nonatomic, retain) NSString * audiofile; 
@property (nonatomic, retain) NSString * detail; 
@property (nonatomic, retain) NSString * title; 
@property (nonatomic, retain) Tour *tour_tourdetails; 

@end 

#import "TourDetail.h" 
#import "Tour.h" 


@implementation TourDetail 

@dynamic id; 
@dynamic tour_id; 
@dynamic lattitude; 
@dynamic longitude; 
@dynamic audiofile; 
@dynamic detail; 
@dynamic title; 
@dynamic tour_tourdetails; 

@end 

Qualsiasi consiglio che si possa offrire sarebbe molto apprezzato :) Oltre a tutti gli esempi che si possono avere sul modo migliore di definire le proprietà recuperate?

Grazie, Michael

+0

solo per curiosità, come hai popolato il db al primo posto e utilizzando il simulatore di IOS 5? –

+0

Hi Space Dust Ho popolato il db utilizzando gli oggetti del dizionario mms che ho poi mantenuto utilizzando un modello. Questo è stato fatto usando il simulatore iOS5 ma anche quando uso il simulatore ios6 i dati sono persistenti ma quando provo a recuperare la mia proprietà recuperata l'eccezione viene lanciata solo con IOS6. Avete qualche idea su come risolvere questo problema? –

+0

Ciao Michael, hai trovato una soluzione a questo? Sto avendo gli stessi problemi. – epologee

risposta

0

Il codice vostro usando qui non è pulito

- (void)loadRecordsFromCoreData { 
    [self.managedObjectContext performBlockAndWait:^{ 
     [self.managedObjectContext reset]; 
     NSError *error = nil; 
     NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entityDescription = [NSEntityDescription entityForName:NSStringFromClass([Tour class]) inManagedObjectContext:self.managedObjectContext]; 
     [request setEntity:entityDescription]; 
     [request setResultType:NSManagedObjectResultType]; 
     [request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"tour_id" ascending:YES]]]; 
     self.tours = [self.managedObjectContext executeFetchRequest:request error:&error]; 
    }]; 

In realtà, si tratta di un po 'di confusione.

Il metodo che si chiama, che chiama un contesto di oggetto gestito, che si chiama inoltre all'interno di un blocco sincrono, che si reimposta senza motivo, che imposta una proprietà 'self.tours' al di fuori del blocco. Tutto molto strano. Puoi spiegare perché lo stai facendo?

Prova questo.

+(void)loadRecordsWithCompletion:(void(^)(NSArray *records, NSError *error))completion { 
    NSManagedObjectContext *context; //Your context 
    NSError *error; 
    NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"attribute" ascending:YES]; 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"EntityName"]; 
    [request setSortDescriptors:@[sortDesc]]; 
    NSArray *records = [context executeFetchRequest:request 
               error:&error]; 
    completion(records, error); 
} 
Problemi correlati