2013-02-08 21 views
5

Tôi gặp sự cố nghiêm trọng trong cơ sở dữ liệu CoreData của mình. Tôi đã tạo mối quan hệ Một đến Nhiều giữa 2 bảng và thêm một Thuộc tính đã Tìm nạp trên Bảng chứa tất cả các giá trị duy nhất. Tất cả các mã làm việc như mong đợi trong iOS 5 nhưng trong iOS 6 Tôi nhận errror sau:Thuộc tính đã tải xuống hoạt động trong iOS5 nhưng không phải là iOS6

2013-02-08 15: 15: 49,382 ArdsBoroughCouncil [16.152: C07] * Chấm dứt ứng dụng do ngoại lệ còn tự do ' NSUnknownKeyException ', lý do: ' [< _NSObjectID_48_0 0xb25c3b0> valueForUndefinedKey:]: lớp này là không tuân thủ mã hóa khóa giá trị cho khóa tour_id. ' * Đầu tiên gọi ném stack: (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 : chấm dứt gọi là ném một ngoại lệ

Các vị ngữ định nghĩa cho Thuộc tính Đã lấy được là:

($ FETCH_SOURCE.tour_id == tour_id) AND (! $ FETCH_SOURCE = TỰ)

Tôi đã xác định mảng để trả về tất cả nhận được tất cả các giá trị trong lớp Tour của tôi.

Bạn có biết bất kỳ vấn đề nào với Thuộc tính đã tải xuống với iOS 6 không? Vì tôi không thể hiểu được điều này không có vấn đề gì trong iOS 5 nhưng không thành công trong iOS6.

Xin xem tất cả các mã khác có liên quan dưới đây:

Đoạn code dưới đây là cách tôi đang lấy tất cả hồ sơ:

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

Đoạn code dưới đây giày NSManagedObjects tôi đã xác định:

- 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 

- Chi tiết 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 

Bất kỳ lời khuyên nào bạn có thể cung cấp sẽ được đánh giá cao :) Cũng như bất kỳ ví dụ nào bạn có thể có về cách xác định tốt nhất các thuộc tính đã tìm nạp?

Cảm ơn, Michael

+0

chỉ vì tò mò, bạn đã nhập db ở vị trí đầu tiên và sử dụng trình mô phỏng IOS 5 như thế nào? –

+0

Hi Space Dust Tôi điền vào db bằng cách sử dụng các đối tượng từ điển mms mà sau đó tôi tiếp tục sử dụng một mô hình. Điều này đã được thực hiện bằng cách sử dụng giả lập iOS5 nhưng ngay cả khi tôi sử dụng giả lập ios6 dữ liệu được tiếp tục tồn tại nhưng khi tôi cố gắng truy xuất thuộc tính đã tìm nạp của tôi, ngoại lệ chỉ được ném với IOS6. Bạn có bất kỳ ý tưởng về nợ tôi có thể giải quyết vấn đề này? –

+0

Xin chào Michael, bạn đã tìm ra giải pháp cho điều này chưa? Tôi đang gặp vấn đề tương tự. – epologee

Trả lời

0

Các mã sử dụng của bạn ở đây là không sạch

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

Trong thực tế, nó là một chút bối rối.

Gọi phương thức của bạn, gọi là ngữ cảnh đối tượng được quản lý, trong đó tự gọi thêm trong khối đồng bộ, tự đặt lại không có lý do, đặt thuộc tính 'self.tours' bên ngoài khối. Tất cả đều rất kỳ quặc. Bạn có thể giải thích tại sao bạn đang làm điều này?

Hãy thử thay vào đó.

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