2011-11-09 13 views
0

いくつかのコアデータクラスをサブクラス化しようとしています。私は、次のクラスを持っている:目的C継承

コアデータクラス:

@interface CDExplanatoryMaterial : NSManagedObject 

@property (nonatomic, retain) NSString * document; 
@property (nonatomic, retain) NSString * id; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * pageNumber; 
@property (nonatomic, retain) NSNumber * realPageNumber; 
@property (nonatomic, retain) NSString * url; 

@end 

ビジネスロジッククラスのプロトコル:BLExplanatoryMaterialため

@protocol BLDataClass <NSObject> 

- (NSArray*)favouriteInGroups; 
@property (nonatomic, readonly, retain) NSString* type; 
@property (nonatomic, readonly, retain) NSArray* inFavouriteGroups; 

- (void)addAddToFavouriteGroup: (NSString*) groupName; 
- (void)removeFromFavouriteGroup: (NSString*) groupName; 
- (void)addToHistory; 

@end 

インタフェース:

@interface BLExplanatoryMaterial : CDExplanatoryMaterial <BLDataClass> 

は、私がデータを取得しますこのように:

+ (NSMutableArray*) explanatoryMaterials { 
    NSMutableArray* results = [[NSMutableArray alloc] init]; 
    for(CDExplanatoryMaterial *item in [Helper fetchDataObjectsOfType:@"CDExplanatoryMaterial"]) 
    { 
     [results addObject: (BLExplanatoryMaterial*)item]; 
    } 
    return results; 
} 

ヘルパークラスは次のようになります。私が持っている

@implementation Helper 
+ (NSArray*) fetchDataObjectsOfType:(NSString *)type { 
    DataManager* manager = [DataManager sharedInstance]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
           entityForName:type inManagedObjectContext:manager.mainObjectContext]; 
    [fetchRequest setEntity:entity]; 
    NSError *error; 
    NSArray *fetchedObjects = [manager.mainObjectContext executeFetchRequest:fetchRequest error:&error]; 
    return fetchedObjects; 
} 
@end 

この問題はfetchDataObjectsOfTypeでfetchedObjectsアレイとexplanatoryMaterialsで結果配列のみNSManagedObjectのオブジェクトが含まれていることです。私はfetchedObjectsにCDExplanatoryMaterialオブジェクトとBLExplanatoryMaterialを含む結果が含まれていると思います。私は最終結果がBLExplanatoryMaterialオブジェクトである必要がありますか、私はインスタンスメソッドを使用することはできません、これを行うための最善の方法は何ですか?

おかげで、

ジョー

EDIT:

ちょうどそれがexpMatがNSManagedObjectで、addToFavouriteGroupメソッドをサポートしていないため失敗し、次のコードで明確にします。

NSMutableArray* expMats = [Data explanatoryMaterials]; 
BLExplanatoryMaterial* expMat = (BLExplanatoryMaterial*) [expMats objectAtIndex:0]; 
[((BLExplanatoryMaterial*)expMat) addToFavouriteGroup:@"Test Group"] 

私の言うことを忘れてしまったことの1つは、オリジナルの投稿のすべてのコードが静的ライブラリにあることです。この編集に投稿されたコードは、IOS Appプロジェクトにあります。これが違いを生むかどうかは分かりません。静的ライブラリ内のすべてのクラスはpublicとしてマークされます。

答えて

1

管理対象オブジェクトモデルのエンティティのクラスとしてBLExplanatoryMaterialを指定する必要があります。これにより、NSManagedObjectではなく、そのクラスのオブジェクトをインスタンス化するようにCore Dataに指示します。

+0

私はConfigurations - > Defaultビットを調べて、CDExplanatoryMaterialはCDExplanatoryMaterialエンティティのクラスであると言います。これは正しいと思う?私はそれを変更しようとします。 – JoeS

+0

クラスを変更しても違いはありません。 – JoeS

+0

'NSManagedObject'サブクラスで' -awakeFromFetch'をオーバーライドして、オブジェクトがストアからフェッチされたときに呼び出されるかどうか確認できますか? – Aderstedt

0

ありがとうございました。コアデータクラスは別々の静的ライブラリにあるため、メインバンドルに組み込まれていないことが判明しました。これを回避するために、私はメインアプリケーション内でそれらをサブクラス化し、それらのサブクラスでコアデータファイルを指していました。