我有一个关于CoreData的简单问题。我正在Swift中开发一个应用程序,在那里我查询返回JSON数据的远程API。响应在我这边从字符串序列化为字典。
我在Core Data模型中有多个实体,它们之间有关系。
从API获取响应时,我使用自定义初始化程序创建一个对象(NSManagedObject的子类)。
这是一个简化的例子:
class Song: NSManagedObject {
@NSManaged var type : Type?
@NSManaged var name : String?
override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) {
super.init(entity: entity, insertIntoManagedObjectContext: context)
}
init(fromDictionary dictionary: NSDictionary, context: NSManagedObjectContext, filterRemoved: Bool) {
let entity = NSEntityDescription.entityForName("Song", inManagedObjectContext: context)!
super.init(entity: entity, insertIntoManagedObjectContext: context)
if let nameValue = dictionary["name"] as? String{
name = nameValue
}
if let typeData = dictionary["type"] as? NSDictionary{
type = Type(fromDictionary: typeData, context:context)
}
}
我的问题是关于Type元素。服务器端有一些固定数量的类型(" Dance"," Jazz",...),因此我想要修复多种类型在我的核心数据中。但是,在我当前的实现中,每次创建Song对象时都会创建一个新的Type实体。所以我喜欢的是某种"外键"两者之间的关联(即使CoreData本身不是数据库......)
知道Type有一个id属性在服务器上唯一标识它的最佳方法是什么?或者在使用Core Data时我真的不应该关心这些事情吗?
答案 0 :(得分:0)
在核心数据中使用唯一ID非常有用。然后,您可以快速查询以查看具有该id的类型是否存在,并返回该类型(如果存在)(只要您创建一个Type实体)。如果它不存在,则创建它。
func fetchType(typeID: Int) -> Type? {
// Define fetch request/predicate
var fetchRequest = NSFetchRequest(entityName: "Type")
let predicate = NSPredicate(format: "id == %@", typeID)
// Assign fetch request properties
fetchRequest.predicate = predicate
fetchRequest.fetchBatchSize = 1
fetchRequest.fetchLimit = 1
// Handle results
let fetchedResults = managedObjectContext?.executeFetchRequest(fetchRequest, error: nil)
if fetchedResults?.count != 0 {
if let fetchedEvent: Event = fetchedResults![0] as? Event {
return fetchedEvent
}
}
return nil
}