25

我曾尝试使用 fetched 属性几次,虽然这似乎是正确的方法,但它从来没有奏效。

在我最近的尝试中,我将 fetched-property 添加到我的实体中,选择模型中的另一个实体作为“目标”,并将谓词设置为我知道有效的条件。

问题 1:当实体的 NSManagedObject 类生成时,它不包含任何获取属性的内容。经过一番搜索,我在 .h 文件中添加了它的声明,并在 .m 文件中添加了它的 @dynamic 语句(是的,我知道它是一个 NSArray * 类型)。

问题 2:即使在那之后,当我在代码中访问此属性时,我会抛出一个异常,该异常表明 fetch-request 没有实体。我假设“实体”将是指定为“目的地”的实体,实际上它就在那里。

因此,我希望有人提供一个具体的工作示例(iOS 平台),其中在模型中定义了获取的属性,在 NSManagedObject 派生类中声明,并实际从代码中使用。

在这一点上,我放弃了这种浪费时间的方法,而只是自己实现了获取请求代码。

4

3 回答 3

30

这是我的相关代码位(包括您已经提到的位):

我的示例有一个 'Card' 对象,它与 'Stats' 对象具有 1->many 关系。每个“统计”对象都有一个可以是 1-4 的“结果”。我获取的属性是一个简单的属性,它可以给我的“卡片”对象一个“统计”对象数组,这些对象只有“结果”=1。

我想使用 fetched 属性,以便我可以轻松获取具有超过一定数量和种类的“统计”对象的“卡片”对象。

因此,在“Card”对象中,我将 Fetched 属性“statsOfTypeOne”,Destination 设置为“Stats”。

在这个获取的属性的谓词中,我把

(SELF.outcome=1) AND (SELF.card=$FETCH_SOURCE)

'SELF' 是 'stats' 记录,执行时 $FETCH_SOURCE 神奇地变成了 'Card' 对象。

正如您所做的那样,我将以下内容放入“卡片”对象的 .h 和 .m 文件中:

@property (nonatomic, retain) NSArray *statsOfTypeOne;
@dynamic statsOfTypeOne;

然后在我的代码中我使用了:

[self.managedObjectContext refreshObject:cardInstance mergeChanges:YES];
[cardInstance valueForKey:@"statsOfTypeOne"]

获取数组(尽管 cardInstance.statsOfTypeOne 应该没问题)。如果没有刷新对象,它不会更新 Fetched 属性(根据手册)。

认为这就是我为使它发挥作用所做的一切。请让我知道这对你有没有用。

彼得

于 2011-10-28T16:36:43.057 回答
5

添加到@Peter的答案。以下是我如何在 Swift 2.0 和 Xcode 7 中使用它:

import Foundation
import CoreData

@objc(Card)
class Card: NSManagedObject {

    @NSManaged var statsOfTypeOne: [Stat]

}

然后,读取获取的属性:

managedObjectContext.refreshObject(someCard, mergeChanges: true)
// This works and returns [Stat] type
someCard.statsOfTypeOne
// So does this
someCard.valueForkey("statsOfTypeOne") as! [Stat]
于 2015-08-04T08:04:13.103 回答
2

你看过这个之前的问题吗:Xcode 4 Core Data: How to use fetched property created in Data Model editor

通读接受的答案和所有评论。听起来他们已经解决了。

于 2011-09-08T00:21:49.357 回答