我正在尝试子类化一些Core Data类。我有以下课程:
核心数据类:
@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
业务逻辑类的协议:
@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
BLExplanatoryMaterial的接口:
@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数组和explainMaterials中的results数组只包含NSManagedObject对象。我希望fetchedObjects包含CDExplanatoryMaterial对象和结果以包含BLExplanatoryMaterial。我需要最终结果是BLExplanatoryMaterial对象或者我不能使用我的任何实例方法,最好的方法是什么?
谢谢,
乔
编辑:
只是为了澄清它是下面的代码失败,因为expMat是NSManagedObject并且不支持addToFavouriteGroup方法。
NSMutableArray* expMats = [Data explanatoryMaterials];
BLExplanatoryMaterial* expMat = (BLExplanatoryMaterial*) [expMats objectAtIndex:0];
[((BLExplanatoryMaterial*)expMat) addToFavouriteGroup:@"Test Group"]
我忘记提到的一件事是我原始帖子中的所有代码都在静态库中。此编辑中发布的代码位于IOS App项目中。我不确定这是否有所作为。静态库中的所有类都标记为public。
答案 0 :(得分:1)
您需要将BLExplanatoryMaterial
指定为托管对象模型中实体的类。这将告诉Core Data实例化该类的对象而不是NSManagedObject
。
答案 1 :(得分:0)
感谢所有帮助。事实证明,因为核心数据类是在一个单独的静态库中,所以它们并没有内置到主包中。为了解决这个问题,我在主应用程序中将它们子类化,然后将核心数据文件指向那些子类。