我尝试过多次使用获取的属性,虽然它似乎是正确的方法,但从不有效。
在我最近的尝试中,我将fetched-property添加到我的实体,选择模型中的另一个实体作为'destination',并将谓词设置为我知道有效的条件。
问题1:当生成实体的NSManagedObject类时,它不包含fetched-property的任何内容。经过一些搜索后,我在.h文件中添加了声明,在.m文件中添加了@dynamic语句(是的,我知道它是NSArray *类型)。
问题2:即使在那之后,当我在代码中访问此属性时,我会抛出一个异常,说明fetch-request没有实体。我假设“实体”将被指定为“目的地”,实际上它就在那里。
所以,我希望有人提供一个具体的工作示例(iOS平台),其中在模型中定义了fetched-property,在NSManagedObject派生类中声明,并且实际上是从代码中使用的。
此时我放弃了这个时间浪费,只是自己实现了获取请求代码。
答案 0 :(得分:26)
这是我的相关代码位(包括你已经提到的位):
我的示例有一个'卡'对象,与'统计'对象有1>多个关系。每个'Stats'对象都有一个'结果',可以是1-4。我的获取属性是一个简单的属性,可以为我的“卡片”对象提供一系列“结果”对象,这些对象只有'结果'= 1。
我想使用fetched属性,这样我就可以轻松掌握具有超过一定数量和类型的'Stats'对象的'Card'对象。
因此,在'Card'对象中,我将Fetched Property'statsOfTypeOne'与Destination设置为'Stats'。
在这个获取属性的谓词中我放了
(SELF.outcome=1) AND (SELF.card=$FETCH_SOURCE)
'SELF'是'stats'记录,$ FETCH_SOURCE在执行时神奇地成为'Card'对象。
正如您所做的那样,我将以下内容放在'Card'对象的.h和.m文件中:
@property (nonatomic, retain) NSArray *statsOfTypeOne;
@dynamic statsOfTypeOne;
然后在我使用的代码中:
[self.managedObjectContext refreshObject:cardInstance mergeChanges:YES];
[cardInstance valueForKey:@"statsOfTypeOne"]
获取数组(虽然cardInstance.statsOfTypeOne应该没问题)。如果没有刷新对象,则不会更新Fetched属性(根据手册)。
我认为这就是我为使其发挥作用所做的一切。让我知道它是否适合你。
彼得
答案 1 :(得分: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]
答案 2 :(得分:2)
您是否看过上一个问题:Xcode 4 Core Data: How to use fetched property created in Data Model editor
阅读已接受的答案和所有评论。这听起来好像已经整理好了。