CoreData:将字符串转换为 NSManagedObject 实例
CoreData: Converting a String into an NSManagedObject instance
我一直在为我的一个 iOS 应用程序使用 CoreData,我想构建一个辅助函数来将 CoreData 实体的 String
表示转换为 NSManagedObject
实例该实体的。我刚刚完成了我的第一门 Swift 专业课程,根据我的理解,我认为 logic/implementation 相当简单。我认为我的实现是错误的,因为 Swift 是我最新的编程语言。我试图避免对解决方案进行硬编码,因为我的直觉告诉我有更好、更通用的方法来实现我的目标。
示例(朴素的伪代码):
func getEntity(from string: String) -> NSManagedObject {
return string as! NSManagedObject
}
期望的执行:
let stringRep = "Entity"
entity(from: stringRep)
Entity
上下文:
我正在使用的两个 CoreData 实体是 Category
和 Service
。
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)
您可以根据实体名称创建某个实体的新对象。与往常一样,您将需要托管对象上下文。
首先你必须得到 NSEntityDescription
:
let entity = NSEntityDescription.entity(forEntityName: "Widget", in: context)
然后就可以创建对象了:
let newWidget = NSManagedObject(entity: entity, in: context)
不过,使用子类会好很多。它会自动包含实体信息。
let newWidget = Widget(context: context) // much easier
那样是不行的...
1,假设有一个实体名称为"Person",因为你有一个属性为"name"
2,通过 fetch 查询有一个类似于 xx12145ac 的 NSManagedObject
要么
创建一个新的 NSManagedobject of person
3,一旦你有了Person类型的对象,你就可以设置
myPersonObj.name="SomeOne"为!字符串
希望对您有所帮助!!!
如果您遇到任何问题,请告诉我..:)
我一直在为我的一个 iOS 应用程序使用 CoreData,我想构建一个辅助函数来将 CoreData 实体的 String
表示转换为 NSManagedObject
实例该实体的。我刚刚完成了我的第一门 Swift 专业课程,根据我的理解,我认为 logic/implementation 相当简单。我认为我的实现是错误的,因为 Swift 是我最新的编程语言。我试图避免对解决方案进行硬编码,因为我的直觉告诉我有更好、更通用的方法来实现我的目标。
示例(朴素的伪代码):
func getEntity(from string: String) -> NSManagedObject {
return string as! NSManagedObject
}
期望的执行:
let stringRep = "Entity"
entity(from: stringRep)
Entity
上下文:
我正在使用的两个 CoreData 实体是 Category
和 Service
。
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)
您可以根据实体名称创建某个实体的新对象。与往常一样,您将需要托管对象上下文。
首先你必须得到 NSEntityDescription
:
let entity = NSEntityDescription.entity(forEntityName: "Widget", in: context)
然后就可以创建对象了:
let newWidget = NSManagedObject(entity: entity, in: context)
不过,使用子类会好很多。它会自动包含实体信息。
let newWidget = Widget(context: context) // much easier
那样是不行的...
1,假设有一个实体名称为"Person",因为你有一个属性为"name"
2,通过 fetch 查询有一个类似于 xx12145ac 的 NSManagedObject 要么 创建一个新的 NSManagedobject of person
3,一旦你有了Person类型的对象,你就可以设置
myPersonObj.name="SomeOne"为!字符串
希望对您有所帮助!!!
如果您遇到任何问题,请告诉我..:)