CoreData:将String转换为NSManagedObject实例

时间:2017-04-15 17:48:35

标签: swift string core-data nsmanagedobject nsentitydescription

我一直在为我的一个iOS应用程序使用CoreData,并希望构建一个帮助函数,将CoreData实体的String表示形式转换为该实体的NSManagedObject实例。我刚刚为我的专业完成了我的第一个Swift课程,根据我的理解,我认为逻辑/实现非常简单。我相信我的实现是错误的,因为Swift是我最新的编程语言。我试图避免对解决方案进行硬编码,因为我的直觉告诉我有更好,更通用的方法来实现我的目标。

示例(NaïvePseudocode):

func getEntity(from string: String) -> NSManagedObject {
    return string as! NSManagedObject
}

期望的执行:

let stringRep = "Entity"
entity(from: stringRep)

Entity

上下文:

我正在使用的两个CoreData实体是CategoryService

public class Category: NSManagedObject { }
public class Service: NSManagedObject { }

Category包含与许多Service实体的关系,以及AppService中使用该关系访问CoreData的其他帮助函数。

CategoryTableViewController有三个静态单元格,每个单元格包含String实体的Category表示。

我将String期间Service等实体的选定prepare(for segue: UIStoryboardSegue, sender: Any?)表示传递给UIViewController的下一个UITableView

使用新的辅助函数,我可以使用String表示从CoreData中模糊地获取,并在UITableView中显示数据。

我的最终目标是使用以下功能在AppService中删除不必要的功能。

func get(_ entities: String, for category: Category) -> NSFetchedResultsController<T> {
    let someEntity = getEntity(from: entities)
    let fetchRequest: NSFetchRequest<someEntity> = someEntity.fetchRequest()
    fetchRequest.predicate = NSPredicate(format: "category == %@", category)
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]

    return createFetchedResultsController(for: fetchRequest)
}

示例:

get("Service", for: category)

2 个答案:

答案 0 :(得分:1)

您可以根据实体名称创建某个实体的新对象。与往常一样,您将需要托管对象上下文。

首先,你必须得到NSEntityDescription

let entity = NSEntityDescription.entity(forEntityName: "Widget", in: context)

然后你可以创建对象:

let newWidget = NSManagedObject(entity: entity, in: context)

但是,使用子类会好得多。它自动包含实体信息。

let newWidget = Widget(context: context)  // much easier

答案 1 :(得分:0)

以这种方式不可能......

1,假设有一个实体名称为&#34; Person&#34;,因为你有一个属性为&#34; name&#34;

2,通过fetch查询获得类似xx12145ac的NSManagedObject 要么 创建一个新的NSManagedobject of person

3,一旦你拥有Person类型的对象,你就可以设置

myPersonObj.name =&#34; SomeOne&#34;如!串

我希望能帮到你!!!

如果您遇到任何问题,请告诉我.. :)