CoreData:将字符串转换为 NSManagedObject 实例

Posted

技术标签:

【中文标题】CoreData:将字符串转换为 NSManagedObject 实例【英文标题】:CoreData: Converting a String into an NSManagedObject instance 【发布时间】:2017-04-15 17:48:35 【问题描述】:

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

示例(朴素伪代码):

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 的实体。

我在prepare(for segue: UIStoryboardSegue, sender: Any?) 期间将选定的String 实体(如Service)表示传递给下一个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)

【问题讨论】:

您不能这样做,因为StringNSManagedObject 不相关。而NSManagedObject 不是实体。 我澄清了。由于语言的语义,这就是我为 Swift 编写伪代码的方式。 【参考方案1】:

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

首先你必须得到NSEntityDescription

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

然后就可以创建对象了:

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

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

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

【讨论】:

谢谢,这很有帮助!关于NSEntityDescription 以及如何使用它的文档有点模糊。它应该完全适合我的AppService【参考方案2】:

那样做是不可能的……

1,假设有一个实体名称为“Person”,因为您有一个属性为“name”

2,通过获取查询有一个类似 xx12145ac 的 NSManagedObject 或者 创建 person 的新 NSManagedobject

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

myPersonObj.name = "SomeOne" as!字符串

希望对你有帮助!!!

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

【讨论】:

以上是关于CoreData:将字符串转换为 NSManagedObject 实例的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NSUserDefaults 转换为 CoreData

将 swift 3 项目转换为使用 CoreData

将 CoreData 中的 Array<NSValue> 保存为可转换属性

CoreData 在返回数组时需要一个字符串,在返回一个字符串时需要 NSData

CoreData:使用 NSPredicate 过滤一对多对多关系(此处不允许错误对多键)

在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration