Cocoa touch 核心数据自定义访问器不';我甚至没有接到电话
我有一个我试图在运行时设置的核心数据属性,它的值来自另一个属性。然而,奇怪的是,我构建的自定义访问器似乎从未被调用过 属性Cocoa touch 核心数据自定义访问器不';我甚至没有接到电话,cocoa-touch,core-data,overriding,accessor,Cocoa Touch,Core Data,Overriding,Accessor,我有一个我试图在运行时设置的核心数据属性,它的值来自另一个属性。然而,奇怪的是,我构建的自定义访问器似乎从未被调用过 属性seasonNameVisible,仅从带有搜索字段中术语的谓词调用,如下所示: // Add our search predicates for (NSString *term in searchTerms) { NSPredicate *searchTermPredicate = [NSPredicate predicateWithFormat:@"(episod
seasonNameVisible
,仅从带有搜索字段中术语的谓词调用,如下所示:
// Add our search predicates
for (NSString *term in searchTerms) {
NSPredicate *searchTermPredicate = [NSPredicate predicateWithFormat:@"(episodeName contains[cd] %@) OR (fromSeason.seasonNameVisible contains[cd] %@) OR (fromSeason.fromSeries.seriesName contains[cd] %@)", term, term, term];
[subPredicates addObject:searchTermPredicate];
}
如果我将该属性更改为seasionname
,谓词的该部分将返回一个结果,因此我不会怀疑谓词或任何其他搜索代码
我的计划是在运行时从季节名称
派生季节名称可见
NSString。因此,我修改了seasure
NSManagedObject子类,使用原语访问器覆盖访问器和设置器。但据我所知,我的访问者从未被呼叫过
以下是标题/接口:
//
// Season.h
//
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Episode, Series;
@interface Season : NSManagedObject
@property (nonatomic, retain) NSNumber * seasonIndex;
@property (nonatomic, retain) NSString * seasonName;
@property (nonatomic, retain) NSString * seasonNameVisible;
@property (nonatomic, retain) NSSet *episodes;
@property (nonatomic, retain) Series *fromSeries;
@property (nonatomic, retain) NSString * primitiveSeasonName;
@property (nonatomic, retain) NSString * primitiveSeasonNameVisible;
@end
@interface Season (CoreDataGeneratedAccessors)
- (void)addEpisodesObject:(Episode *)value;
- (void)removeEpisodesObject:(Episode *)value;
- (void)addEpisodes:(NSSet *)values;
- (void)removeEpisodes:(NSSet *)values;
@end
// my additions
@interface Season (PrimitiveAccessors)
- (NSString *)primitiveSeasonName;
- (NSString *)primitiveSeasonNameVisible;
@end
我读过苹果的文档,在StackOverflow上四处搜索自定义访问器方法的帮助,我认为我的代码是对的(这是我第一次尝试使用原始访问器,或者重写NSManagedObject方法,所以我有点超出了我通常的深度),但即使我在上面设置了断点,它似乎从未被调用。您要求核心数据基于延迟加载的属性获取。我认为这是行不通的。在设置季节名称时,您需要将季节名称设置为可见,或者,更合理的做法是,将季节名称的存储分离为前缀(您要删除以提供可见名称)和真实名称 在评论中提供了更多信息后,我将建议如下:
- 将季节分为两个属性,季节编号(int)和季节名称
- 根据季节编号对取货请求进行排序
- section name key path是对象上的一个新只读属性,它返回由数字和名称组成的字符串
seasure
对象,seasenNumber
和seasenName
。你可以按季节号对取货请求进行排序。您的节名关键路径(对于具有seasure
关系的剧集,可能是获取)将是@“seasure.seasuresectionname”
,实现如下-在托管对象模型中没有更改,只更改了seasure对象:
第h季:
@property(nonatomic,readonly) NSString *seasonSectionName;
第三季m:
-(NSString*)seasonSectionName
{
return [NSString stringWithFormat:@"%d - %@",self.seasonNumber,self.seasonName];
}
你真正要做的就是用另一个属性来装饰季号。现在我再看一遍,我怀疑如果我用KVC调用所有东西,我不需要声明基本属性,但这仍然不会改变它没有被调用的事实。谓词用于获取请求,用于搜索视图,它是持久的,因为,正如你在下面的回答中所描述的,你不能用它来获取。问题更多的是
seasonNameVisible
返回nil
,并且没有调用我的自定义访问器来填充它。我猜的答案现在已经被删除了。我非常确定获取请求不会通过对象来获取值,如果它们这样做了,它将是原始值(因此不会设置KVO通知)。如果访问单个对象的seasonNameVisible属性(例如在表视图单元格中显示),是否得到正确的结果?这是SQLLite存储吗?我相信回迁是直接进行的,而不是通过访问器。也许相反,替代aspeName的setter来设置asquarmame visibility?我从未真正设置asquarmame
,因为它是从SQLite数据库中预先加载的数据。我在其中添加了前缀,以便可以将其用作表中的节标题。以前我将它们分开,但是如果字符串上没有前缀,那么它在获取时就不能正确排序,我试图避免为表中每个可能的节标题编写自定义大小写。我意识到这有点笨拙,但我想不出一个更理智的方法。。。也许从seasonName
访问器调用setseasonnameivable
会更有意义?我来试一试。你仍然需要访问每个季节,才能在数据库中存储正确的值。请注意,只要结果的顺序相同,就可以对节名键路径使用瞬时值(例如,仅返回字符串的方法)。季节名称中的数据是什么样的?你是如何推导前缀的?它们的排序顺序不一样,这就是为什么所有这些繁琐的问题摆在首位。季节名称是一个实际的名称,它不会按照季节应该排序的顺序按字母顺序排序。呵呵。我在第一条评论中尝试了我的建议,但遇到麻烦,我得到了:'nsinternalinconsistenceexception',原因:'CoreData:FATAL ERROR:节信息的持久缓存与当前配置不匹配。你有黑眼圈吗
-(NSString*)seasonSectionName
{
return [NSString stringWithFormat:@"%d - %@",self.seasonNumber,self.seasonName];
}