2013-02-08 2 views
5

CoreDataデータベースに深刻な問題があります。私は2つのテーブルの間に1対多の関係を作成し、すべてのユニークな値を含むテーブルにフェッチされたプロパティを追加しました。フェッチされたプロパティはiOS5で動作しますがiOS6では動作しません

2013年2月8日15:15:49.382 ArdsBoroughCouncil [16152:C07]キャッチされない例外によりに*は アプリの終了 "のiOS 5の範囲内が、iOSの6で、私は次のようerrrorを受け取る期待通りにすべてのコードは動作します理由: '[< _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

こんにちはマイケル、これに対する解決策を見つけましたか?私は同じ問題を抱えている。 – 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); 
} 
関連する問題