如何从 Swift 中的特定关系实体中获取数据?
How to fetch data from specific relationship entity in Swift?
我在 Core Data 中有两个关系实体。在第一个实体中,我在属性中添加了公司名称。然后我转到第二个 UIViewController
并在与第一个实体有关系的第二个实体中添加特定公司的其他属性。我还有两个 UITableViewControllers
,第一个 UITableViewController
显示单元格中每个公司的名称。当我选择特定公司时,我转到第二个 UITableViewController
。我想要第二个 UITableViewController
显示我选择的特定公司的数据。我尝试了几种不同的方法,但我做不到我想要的。我怎样才能做到?
第二个UITableViewController
码
override func viewDidLoad() {
super.viewDidLoad()
self.definesPresentationContext = true
println(currentCompany)
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: "activityCompany", cacheName: nil)
fetchedResultsController.delegate = self
fetchedResultsController.performFetch(nil)
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
self.tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - var and let
var currentCompany: String!
var managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
// MARK: - fetchResultsController
var fetchedResultsController: NSFetchedResultsController!
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Information")
var sortDescriptor = NSSortDescriptor(key: "company", ascending: true)
fetchRequest.fetchBatchSize = 50
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.predicate = NSPredicate(format: "company contains [c] %@", currentCompany)
return fetchRequest
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return fetchedResultsController.sections?.count ?? 0
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fetchedResultsController.sections?[section].numberOfObjects ?? 0
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
if var dataForCell = fetchedResultsController.objectAtIndexPath(indexPath) as? Information {
cell.textLabel?.text = dataForCell.activityCompany
cell.detailTextLabel?.text = dataForCell.foundedCompany
}
return cell
}
实体
import Foundation
import CoreData
@objc(Company)
class Company: NSManagedObject {
@NSManaged var nameCompany: String
@NSManaged var information: NSSet
}
import Foundation
import CoreData
@objc(Information)
class Information: NSManagedObject {
@NSManaged var activityCompany: String
@NSManaged var foundedCompany: String
@NSManaged var company: Company
}
我用以下方法将数据保存到实体中。
// MARK: - @IBActions
@IBAction func saveData(sender: UIBarButtonItem) {
var companyEntity = NSEntityDescription.insertNewObjectForEntityForName("Company", inManagedObjectContext: managedObjectContext) as! NSManagedObject
var informationEntity = NSEntityDescription.insertNewObjectForEntityForName("Information", inManagedObjectContext: managedObjectContext) as! NSManagedObject
companyEntity.setValue(currentName, forKey: "nameCompany")
informationEntity.setValue(activityTextField.text, forKey: "activityCompany")
informationEntity.setValue(foundedTextField.text, forKey: "foundedCompany")
companyEntity.setValue(NSSet(object: informationEntity), forKey: "information")
var error: NSError?
managedObjectContext.save(&error)
var story = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var naviController = story.instantiateViewControllerWithIdentifier("firstNavi") as! UINavigationController
presentViewController(naviController, animated: true, completion: nil)
}
我解决了
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Information")
var sortDescriptor = NSSortDescriptor(key: "activityCompany", ascending: true)
fetchRequest.fetchBatchSize = 50
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.predicate = NSPredicate(format: "company.nameCompany contains [c] %@", currentCompany)
return fetchRequest
}
我在 Core Data 中有两个关系实体。在第一个实体中,我在属性中添加了公司名称。然后我转到第二个 UIViewController
并在与第一个实体有关系的第二个实体中添加特定公司的其他属性。我还有两个 UITableViewControllers
,第一个 UITableViewController
显示单元格中每个公司的名称。当我选择特定公司时,我转到第二个 UITableViewController
。我想要第二个 UITableViewController
显示我选择的特定公司的数据。我尝试了几种不同的方法,但我做不到我想要的。我怎样才能做到?
第二个UITableViewController
码
override func viewDidLoad() {
super.viewDidLoad()
self.definesPresentationContext = true
println(currentCompany)
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: "activityCompany", cacheName: nil)
fetchedResultsController.delegate = self
fetchedResultsController.performFetch(nil)
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
self.tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - var and let
var currentCompany: String!
var managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
// MARK: - fetchResultsController
var fetchedResultsController: NSFetchedResultsController!
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Information")
var sortDescriptor = NSSortDescriptor(key: "company", ascending: true)
fetchRequest.fetchBatchSize = 50
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.predicate = NSPredicate(format: "company contains [c] %@", currentCompany)
return fetchRequest
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return fetchedResultsController.sections?.count ?? 0
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fetchedResultsController.sections?[section].numberOfObjects ?? 0
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
if var dataForCell = fetchedResultsController.objectAtIndexPath(indexPath) as? Information {
cell.textLabel?.text = dataForCell.activityCompany
cell.detailTextLabel?.text = dataForCell.foundedCompany
}
return cell
}
实体
import Foundation
import CoreData
@objc(Company)
class Company: NSManagedObject {
@NSManaged var nameCompany: String
@NSManaged var information: NSSet
}
import Foundation
import CoreData
@objc(Information)
class Information: NSManagedObject {
@NSManaged var activityCompany: String
@NSManaged var foundedCompany: String
@NSManaged var company: Company
}
我用以下方法将数据保存到实体中。
// MARK: - @IBActions
@IBAction func saveData(sender: UIBarButtonItem) {
var companyEntity = NSEntityDescription.insertNewObjectForEntityForName("Company", inManagedObjectContext: managedObjectContext) as! NSManagedObject
var informationEntity = NSEntityDescription.insertNewObjectForEntityForName("Information", inManagedObjectContext: managedObjectContext) as! NSManagedObject
companyEntity.setValue(currentName, forKey: "nameCompany")
informationEntity.setValue(activityTextField.text, forKey: "activityCompany")
informationEntity.setValue(foundedTextField.text, forKey: "foundedCompany")
companyEntity.setValue(NSSet(object: informationEntity), forKey: "information")
var error: NSError?
managedObjectContext.save(&error)
var story = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var naviController = story.instantiateViewControllerWithIdentifier("firstNavi") as! UINavigationController
presentViewController(naviController, animated: true, completion: nil)
}
我解决了
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Information")
var sortDescriptor = NSSortDescriptor(key: "activityCompany", ascending: true)
fetchRequest.fetchBatchSize = 50
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.predicate = NSPredicate(format: "company.nameCompany contains [c] %@", currentCompany)
return fetchRequest
}