2013-02-08 5 views
5

CoreData 데이터베이스에서 심각한 문제가 있습니다. 2 개의 테이블 사이에 일대 다 관계를 만들고 모든 유일한 값을 포함하는 테이블에 가져온 속성을 추가했습니다.가져온 속성은 iOS5에서 작동하지만 iOS6에서는 작동하지 않습니다.

2013년 2월 8일 15 : 15 : 49.382 ArdsBoroughCouncil [16152 : C07]에 의한 캐치되지 않는 예외에 *이 응용 프로그램을 종료 '에서 iOS 5에서하지만 아이폰 OS 6에 나는 다음과 같은 errror를받을 예상대로 모든 코드가 작동 NSUnknownKeyException ', 이유 : '[< _NSObjectID_48_0 0xb25c3b0> valueForUndefinedKey :] :이 클래스는키가 아닌 tour_id 키 코딩을 준수합니다. ' * 먼저 던져 호출 스택 : (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 : 라는 종료 예외를 던지는

가져온 속성에 대해 정의 된 조건은 다음과 같습니다

($ FETCH_SOURCE.tour_id == tour_id) AND (! $ FETCH_SOURCE = SELF)

Tour 클래스 내의 모든 값을 모두 반환하도록 배열을 정의했습니다.

iOS 6에서 가져온 속성에 대한 문제가 있습니까? 이해가 안되기 때문에 iOS 5에서는 문제없이 작동하지만 iOS6에서는 실패합니다. NSManagedObjects 내가 정의한 신발 아래

- (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]; 
    }]; 

코드 :

아래의 코드는 내가 모든 레코드를 검색하고 방법입니다

아래 다른 모든 관련 코드를 참조하십시오

을 - 둘러보기

#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 

- 둘러보기 세부 내용

#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 

당신이 제공 할 수있는 조언을 해주시면 대단히 감사하겠습니다. :) 가장 좋은 방법은 가져온 속성을 정의하는 것입니다.

덕분에, 마이클

+0

그냥 호기심에서, 당신은 어떻게 처음에 데이터베이스를 채우고 IOS 5 시뮬레이터를 사용 했습니까? –

+0

Hi Space Dust 나는 모델을 사용하여 유지 한 mms 사전 객체를 사용하여 db를 채 웁니다. 이것은 iOS5 시뮬레이터를 사용하여 수행되었지만 ios6 시뮬레이터를 사용할 때도 데이터가 지속되지만 가져온 속성을 검색하려고하면 예외가 IOS6에서만 발생합니다. 이 문제를 해결할 수있는 아이디어가 있습니까? –

+0

안녕하세요. Michael, 해결책을 찾았습니까? 나는 똑같은 문제를 겪고있다. – epologee

답변

0

당신이 여기에 사용하는 코드는 사실, 조금 혼란

- (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]; 
    }]; 

깨끗하지 않습니다.

관리 객체 컨텍스트를 호출하는 메서드를 호출하면 아무 이유없이 자체를 재설정하는 동기 블록 내에서 자체를 호출하여 블록 외부에 'self.tours'속성을 설정합니다. 모두 매우 이상합니다. 왜 이러는거야?

대신 사용해보십시오.

+(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); 
}