【问题标题】:Core Data - using Transient Properties in Group By核心数据 - 在 Group By 中使用瞬态属性
【发布时间】:2012-03-10 16:38:57
【问题描述】:

我正在创建一个包含一些聚合数据的 UITableView。在此过程中,需要使用部分标题对表格视图单元格进行排序和分组。

问题是我想在 NSFetchRequest 中使用瞬态属性来生成部分标题和结果排序。问题是,在设置 NSFetchRequest 时,我收到一个“NSInvalidArgumentException”,原因是:“传递给 setPropertiesToFetch 的 keypath player.fullName 无效”。

NSFetchRequest 的主要实体是一个具有以下属性的 Player 实体:firstName 和 lastName。为了对数据进行排序和分组,引入了瞬态属性“fullName”。这是 lastName 和 firstName 属性的简单串联。

目前尝试的方法是:

a) 定义 -(NSString*)fullName 方法

b) 定义一个@property (nonatomic,readonly) NSString *fullName

c) 添加@dynamic fullName

d) 将 fullName 属性添加到 Player 实体并使其瞬态。

是否有任何想法或没有办法在包含 group by 子句的 NSFetchRequest 中选择瞬态属性。

任何帮助表示赞赏。

【问题讨论】:

    标签: ios core-data group-by


    【解决方案1】:

    最后,似乎不可能在由 NSFetchResults 和 Group By 组成的组中包含瞬态属性。

    jrturton 的好建议接近了。最后,瞬态属性 fullName 很容易在更新实体时生成,并且更新频率非常低,因此解决方案是停止使用瞬态属性并制作完全成熟的属性。只需将其视为极端的非规范化。

    解决方案是设置以下内容

    -(void)setLastName:(NSString*)aName
    {
        [self willChangeValueForKey: @"lastName" ];
        [self setPrimitiveValue: aName forKey: @"lastName" ];
        [self updateFullName];
        [self didChangeValueForKey: @"lastName" ];
    }
    
    -(void)setFirstName:(NSString*)aName
    {
        [self willChangeValueForKey: @"firstName" ];
        [self setPrimitiveValue: aName forKey: @"firstName"];    
        [self updateFullName];
        [self didChangeValueForKey: @"firstName" ];
    }
    

    这会将 fullName 更新为 Player 实体的属性并消除了我的问题。希望对您有所帮助。

    【讨论】:

    【解决方案2】:

    您不能在提取请求中包含临时属性,但您可以将它们用于部分名称键路径,只要它们以相同的顺序出现。

    尝试根据 lastName 和 firstName(两个单独的排序描述符,在一个数组中)对获取请求进行排序,然后在创建获取的结果控制器时使用 player.fullName 作为部分名称键路径(上面列表中只有 a 和 b) .

    【讨论】:

    • 很好的建议。试了一下,离得这么近。仍然得到 fullName 的 KVO 异常,但我相信这是由于我使用 NSDictionaryResultType 而不是标准实体结果。但肯定给了我一条新的道路。
    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2013-04-20
    • 2013-10-03
    • 2011-08-19
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多