8

次の例外でアプリケーションがクラッシュするという問題があります。

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 を使用すると、キー値のコーディング例外がスローされます。リンク先のテーブルを参照するために使用するプロパティは何ですか?

これについてのすべての助けに本当に感謝します。

ありがとう、マイケル

4

5 に答える 5

0

コードを表示せずに、iOS6 で廃止されたクラスのメソッドを呼び出しているため、クラッシュします。

于 2013-02-07T19:30:20.497 に答える
0

コードを掘り下げなくても、NSFetchRequest は、返される結果のタイプ (NSManagedObject ID ResultType または NSManagedObjectResultType など) を設定できます。

NSManagedObjectResultType が必要ですが、NSManagedObjectIDResultType が返されます。

于 2015-02-08T16:48:48.923 に答える
0

@property (非アトミック、保持) NSNumber * id;

idObjective-C の予約語ではありませんか? このプロパティの名前を別の名前に変更して、競合が発生しているかどうかを確認しましたか?

于 2013-02-08T10:00:45.767 に答える
0

あなたが投稿したコードにはviewWillAppear、明らかな方法で Core Data に触れるものは何もないため、何が起こっているのかを推測するのが難しくなります。これらのオブジェクトの一部は管理対象オブジェクトである可能性がありますが、どのオブジェクトがどのように作成されたかは誰にもわかりません。

ただし、エラー メッセージは大きな手がかりを提供します。

[<_NSObjectID_48_0 0xb63e310> valueForUndefinedKey:]: this class is not key value coding-compliant for the key id.

これが言及されているという事実は、インスタンスを期待しているときに_NSObjectID_48_0、ある時点でインスタンスを使用していることを示しています。エンティティがどのように見えても、という名前のプロパティはありません。そのため、プロパティを要求すると、「キー値コーディングに準拠していません」というエラーが発生します。NSManagedObjectIDNSManagedObjectNSManagedObjectIDidid

Core Data をどのように使用しているかについての手がかりを与えるコードを投稿していないため、なぜこれが発生するのかについてはまだ言えません。

それは述語と関係があるかもしれません:

tour_id == $FETCH_SOURCE.id

となるようにフェッチを作成した場合、これ$FETCH_SOURCENSManagedObjectID問題になります。たぶん (そして私は推測することしかできません) の結果タイプを求めているときにそれを使用していますNSManagedObjectIDResultType

于 2013-02-07T22:18:21.113 に答える
0

MagicalRecord を使用すると同じ問題が発生しますが、Xcode を使用して CoreData ソース コードを生成する場合は問題ありません。

于 2016-09-20T02:26:10.747 に答える