将具有相同属性的实体合并为一个实体

时间:2016-01-11 13:08:36

标签: swift core-data

我的项目有点长,所以我会尝试用更简单的示例项目来表达我的问题。

假设我目前在我的核心数据模型中有三个实体:OneEntity,TwoEntity和ThreeEntity。每个实体都具有相同的属性:OneAttribute,TwoAttribute和ThreeAttribute。

有三个UITableViewControllers:OneTable,TwoTable和ThreeTable。每个表都列出了实体的所有条目。 OneTable列出OneEntity的所有条目,TwoTable列出TwoEntity的所有条目,ThreeTable列出ThreeEntity的所有条目。

在每个表中,原型单元格使用object.valueForKey(“OneAttribute”),object.valueForKey(“TwoAttribute”)和object.valueForKey(“ThreeAttribute”)来设置放入其中的标签的值。原型细胞。

我现在计划将所有实体合并为一个实体MergedEntity,其中包含上述重复属性OneAttribute,TwoAttribute和ThreeAttribute。

然后,例如,当在OneTable中使用object.valueForKey(“OneAttribute”)时,我怎么才输出以前保存到OneEntity中的MergedEntity中的条目?

2 个答案:

答案 0 :(得分:0)

如果你要合并,你应该最终得到一个具有一个属性的实体,而不是3.这个实体也应该有一个'类型'属性,以便您可以告诉每个实例的用途。

现在,您的提取请求使用'类型'过滤每个视图控制器的结果(用实际类型替换"XXX",可能是字符串或int):

fetchRequest.predicate = NSPredicate(format: "type = %@", argumentArray: [ "XXX" ])

答案 1 :(得分:0)

找到答案。

像Wain所说,一般的方法是向合并的实体添加'type'属性。然后还有三个步骤适用于我的情况:

1)保存密钥时设置'type'属性的值(参见下面的最后一行)。

//1
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context : NSManagedObjectContext = appDel.managedObjectContext

//2
let newPost: NSManagedObject = NSEntityDescription.insertNewObjectForEntityForName("MergedEntity", inManagedObjectContext: context)

//3
newPost.setValue("Test A", forKey: "OneAttribute")
newPost.setValue("Test B", forKey: "TwoAttribute")
newPost.setValue("Test C", forKey: "ThreeAttribute")
newPost.setValue("This is the search String to look for.", forKey: "type")

2)定义谓词常量。

let typePredicate = NSPredicate(format: "%K CONTAINS[cd] %@", "type", "This is the search String to look for.")

3)为获取请求添加谓词(参见下面的最后一行)。

let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
self.managedObjectContext = appDel.managedObjectContext

let fetchRequest = NSFetchRequest()
// Edit the entity name as appropriate.
let entity = NSEntityDescription.entityForName("MergedEntity", inManagedObjectContext: self.managedObjectContext!)
fetchRequest.entity = entity

// Set predicate
fetchRequest.predicate = typePredicate

编辑:Wain善意添加了更多代码。他的代码结合了步骤2)和3) - 谢谢你的帮助。