次の例外でアプリケーションがクラッシュするという問題があります。
ABC[1936:c07] *例外 'NSUnknownKeyException' が捕捉されなかったため、アプリを終了しています。
この例外の奇妙な問題は、iOS5 を使用すると発生しないことです。以下の例外が発生するコードを参照してください。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if ((self.sectionInfoArray == nil) ||
([self.sectionInfoArray count] != [self numberOfSectionsInTableView:self.tableView]))
{
NSMutableArray *infoArray = [[NSMutableArray alloc] init];
for (Tour *tour in self.tours)
{
SectionInfo *sectionInfo = [[SectionInfo alloc] init];
sectionInfo.tour = tour;
sectionInfo.open = NO;
NSLog(@"Tour Details Count %@", [[tour tourDetails] objectAtIndex:0]);
NSNumber *defaultRowHeight = [NSNumber numberWithInteger:DEFAULT_ROW_HEIGHT];
NSInteger countOfQuotations = [[sectionInfo.tour tourDetails] count];
for (NSInteger i = 0; i < countOfQuotations; i++)
{
[sectionInfo insertObject:defaultRowHeight inRowHeightsAtIndex:i];
}
[infoArray addObject:sectionInfo];
}
self.sectionInfoArray = infoArray;
}
}
この例外は、TourDetail クラスの配列を取得するクラス Tour 内で Fetched プロパティが定義されているために発生するのでしょうか。以下の両方のクラスの実装コードを参照してください。
#import "Tour.h"
#import "TourDetail.h"
@implementation Tour
@dynamic background_url;
@dynamic id;
@dynamic summary;
@dynamic title;
@dynamic tour_tourdetail;
@dynamic tourDetails;
@end
#import "TourDetail.h"
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class TourDetail;
@interface Tour : NSManagedObject
@property (nonatomic, retain) NSString * background_url;
@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSString * summary;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) TourDetail *tour_tourdetail;
@property (nonatomic, retain) NSArray *tourDetails;
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface TourDetail : NSManagedObject
@property (nonatomic, retain) NSString * audiofile;
@property (nonatomic, retain) NSString * detail;
@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSNumber * lattitude;
@property (nonatomic, retain) NSNumber * longitude;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSNumber * tour_id;
@property (nonatomic, retain) NSManagedObject *tourdetail_tour;
@end
@implementation TourDetail
@dynamic audiofile;
@dynamic detail;
@dynamic id;
@dynamic lattitude;
@dynamic longitude;
@dynamic title;
@dynamic tour_id;
@dynamic tourdetail_tour;
@end
この問題に関するヘルプをいただければ幸いです。どうすればこれを修正できるか途方に暮れているので。
ありがとう、マイケル
アップデート:
Fetched Property を削除すると、iOS6 では例外は発生しません。以下に構成した述語を参照してください。
取得したプロパティ tourDetails 述語 tour_id == $FETCH_SOURCE.id
この述語のセットアップで何か間違っていることがわかりますか? 私の目標は、Tour テーブル内の id 列を計算する各 tour_id の TourDetail オブジェクトの配列を返すことができるように、これを使用することです。
アップデート:
両方のテーブルを個別に呼び出すと例外が発生しないため、述語が原因で例外がスローされていることを診断できました。私が作成した述語に問題はありますか?
Core Data DB からオブジェクトを取得する方法を示す以下のコードを参照してください。
- (void)viewDidLoad
{
[super viewDidLoad];
[DrivingToursContent setupStaticData];
self.tableView.sectionHeaderHeight = HEADER_HEIGHT;
_openSectionIndex = NSNotFound;
self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"custombackground.ptoung"]];
self.managedObjectContext = [[BaseCoreDataController sharedInstance] newManagedObjectContext];
[self loadRecordsFromCoreData];
[self loadRecordsFromCoreDataForTourDetail];
NSLog(@"Tour Detail array count: %d", [self.toursTest count]);
// Do any additional setup after loading the view.
}
- (void)loadRecordsFromCoreData {
[self.managedObjectContext performBlockAndWait:^{
[self.managedObjectContext reset];
NSError *error = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([Tour class])];
[request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES]]];
self.tours = [self.managedObjectContext executeFetchRequest:request error:&error];
}];
}
アップデート:
問題の根本は、Fetched プロパティに対して定義した Predicate にあることは間違いありませんが、2 つのテーブル間をリンクする述語をどのように記述すればよいか教えていただけますか。述語 tour_id == 0 を記述して id を直接参照すると、フェッチされたプロパティが存在することがわかっているので、正しく動作します。しかし、 $FETCH_SOURCE.id を使用すると、キー値のコーディング例外がスローされます。リンク先のテーブルを参照するために使用するプロパティは何ですか?
これについてのすべての助けに本当に感謝します。
ありがとう、マイケル