如何从关系实体中进行简单的获取? Swift
How to make a simple fetch from relationship entities? Swift
我在Xcode做了两个关系实体,我用的是Swift。我在核心数据中建立了一个简单的关系。
公司代码
import Foundation
import CoreData
@objc(Company)
class Company: NSManagedObject {
@NSManaged var nameCompany: String
@NSManaged var additional: NSSet
}
附加代码
import Foundation
import CoreData
@objc(Additional)
class Additional: NSManagedObject {
@NSManaged var acitvityCompany: String
@NSManaged var founded: String
@NSManaged var company: Company
}
我编写了以下代码,将数据添加到实体中。有用。
@IBAction func saveData(sender: UIBarButtonItem) {
var companyEntity = NSEntityDescription.insertNewObjectForEntityForName("Company", inManagedObjectContext: managedObjectContext) as! NSManagedObject
var additionalEntity = NSEntityDescription.insertNewObjectForEntityForName("Additional", inManagedObjectContext: managedObjectContext) as! NSManagedObject
companyEntity.setValue(nameCompanyTextField.text, forKey: "nameCompany")
additionalEntity.setValue(activityTextField.text, forKey: "acitvityCompany")
additionalEntity.setValue(foundedTextField.text, forKey: "founded")
companyEntity.setValue(NSSet(object: additionalEntity), forKey: "additional")
managedObjectContext.save(nil)
var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var navi = storyboard.instantiateViewControllerWithIdentifier("navi") as! UINavigationController
self.presentViewController(navi, animated: true, completion: nil)
// println("company \(companyEntity)")
// println("additional \(additionalEntity)")
}
当我移动到显示来自实体的数据的 UITableViewController
时。如果我从其他实体获取数据,我会收到错误消息。 CoreData:致命错误:部分信息的持久缓存与当前配置不匹配。你在没有禁用缓存或使用 +deleteCacheWithName:
的情况下非法改变了 NSFetchedResultsController 的获取请求、它的谓词或它的排序描述符
如果我只从公司实体获取数据,效果很好。
我的UITableViewController
override func viewDidLoad() {
super.viewDidLoad()
self.definesPresentationContext = true
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: "nameCompany", cacheName: "nameCompany")
fetchedResultsController.delegate = self
fetchedResultsController.performFetch(nil)
fetchedResultsController2 = NSFetchedResultsController(fetchRequest: fetchRequest2(), managedObjectContext: managedObjectContext, sectionNameKeyPath: "company", cacheName: "company")
fetchedResultsController2.delegate = self
fetchedResultsController2.performFetch(nil)
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.tableView.reloadData()
}
// MARK: - var and let
var managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
// MARK: - fetchedResultsController
var fetchedResultsController: NSFetchedResultsController!
var fetchedResultsController2: NSFetchedResultsController!
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Company")
let sortDescriptor = NSSortDescriptor(key: "nameCompany", ascending: true)
fetchRequest.fetchBatchSize = 50
fetchRequest.predicate = nil
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
func fetchRequest2() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Additional")
let sortDescriptor = NSSortDescriptor(key: "company", ascending: true)
fetchRequest.fetchBatchSize = 50
fetchRequest.predicate = nil
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
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? Company {
var additionalCell = fetchedResultsController2.objectAtIndexPath(indexPath) as! Additional
cell.textLabel?.text = dataForCell.nameCompany
cell.detailTextLabel?.text = "\(additionalCell.acitvityCompany) - \(additionalCell.founded)"
}
return cell
}
我知道怎么做了。
var currentDate: NSDate!
// MARK: - NSFetchedResultsController
var fetchedResultsController: NSFetchedResultsController!
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Car")
let sortDescriptor = NSSortDescriptor(key: "personCar", ascending: true)
fetchRequest.predicate = NSPredicate(format: "personRelationship.datePerson contains[c] %@", currentDate)
fetchRequest.fetchBatchSize = 50
fetchRequest.fetchLimit = 50
fetchRequest.sortDescriptors = [sortDescriptor]
println(fetchRequest)
return fetchRequest
}
我在Xcode做了两个关系实体,我用的是Swift。我在核心数据中建立了一个简单的关系。
公司代码
import Foundation
import CoreData
@objc(Company)
class Company: NSManagedObject {
@NSManaged var nameCompany: String
@NSManaged var additional: NSSet
}
附加代码
import Foundation
import CoreData
@objc(Additional)
class Additional: NSManagedObject {
@NSManaged var acitvityCompany: String
@NSManaged var founded: String
@NSManaged var company: Company
}
我编写了以下代码,将数据添加到实体中。有用。
@IBAction func saveData(sender: UIBarButtonItem) {
var companyEntity = NSEntityDescription.insertNewObjectForEntityForName("Company", inManagedObjectContext: managedObjectContext) as! NSManagedObject
var additionalEntity = NSEntityDescription.insertNewObjectForEntityForName("Additional", inManagedObjectContext: managedObjectContext) as! NSManagedObject
companyEntity.setValue(nameCompanyTextField.text, forKey: "nameCompany")
additionalEntity.setValue(activityTextField.text, forKey: "acitvityCompany")
additionalEntity.setValue(foundedTextField.text, forKey: "founded")
companyEntity.setValue(NSSet(object: additionalEntity), forKey: "additional")
managedObjectContext.save(nil)
var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var navi = storyboard.instantiateViewControllerWithIdentifier("navi") as! UINavigationController
self.presentViewController(navi, animated: true, completion: nil)
// println("company \(companyEntity)")
// println("additional \(additionalEntity)")
}
当我移动到显示来自实体的数据的 UITableViewController
时。如果我从其他实体获取数据,我会收到错误消息。 CoreData:致命错误:部分信息的持久缓存与当前配置不匹配。你在没有禁用缓存或使用 +deleteCacheWithName:
如果我只从公司实体获取数据,效果很好。
我的UITableViewController
override func viewDidLoad() {
super.viewDidLoad()
self.definesPresentationContext = true
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: "nameCompany", cacheName: "nameCompany")
fetchedResultsController.delegate = self
fetchedResultsController.performFetch(nil)
fetchedResultsController2 = NSFetchedResultsController(fetchRequest: fetchRequest2(), managedObjectContext: managedObjectContext, sectionNameKeyPath: "company", cacheName: "company")
fetchedResultsController2.delegate = self
fetchedResultsController2.performFetch(nil)
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.tableView.reloadData()
}
// MARK: - var and let
var managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
// MARK: - fetchedResultsController
var fetchedResultsController: NSFetchedResultsController!
var fetchedResultsController2: NSFetchedResultsController!
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Company")
let sortDescriptor = NSSortDescriptor(key: "nameCompany", ascending: true)
fetchRequest.fetchBatchSize = 50
fetchRequest.predicate = nil
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
func fetchRequest2() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Additional")
let sortDescriptor = NSSortDescriptor(key: "company", ascending: true)
fetchRequest.fetchBatchSize = 50
fetchRequest.predicate = nil
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
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? Company {
var additionalCell = fetchedResultsController2.objectAtIndexPath(indexPath) as! Additional
cell.textLabel?.text = dataForCell.nameCompany
cell.detailTextLabel?.text = "\(additionalCell.acitvityCompany) - \(additionalCell.founded)"
}
return cell
}
我知道怎么做了。
var currentDate: NSDate!
// MARK: - NSFetchedResultsController
var fetchedResultsController: NSFetchedResultsController!
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Car")
let sortDescriptor = NSSortDescriptor(key: "personCar", ascending: true)
fetchRequest.predicate = NSPredicate(format: "personRelationship.datePerson contains[c] %@", currentDate)
fetchRequest.fetchBatchSize = 50
fetchRequest.fetchLimit = 50
fetchRequest.sortDescriptors = [sortDescriptor]
println(fetchRequest)
return fetchRequest
}