我试图简单地存储和检索CoreData(我以前用
swift成功的东西).我的数据没有数据,但现在(不知道是什么改变)我没有得到错误,只是没有显示在表格中.我不知道是否存储或检索对象的问题.我已经跟随我在另一个应用程序中尽可能的做了,但似乎有一些根本的事情,我没有得到.这是我有的
我的型号:
- import Foundation
- import CoreData
- @objc(DataModel)
- class DataModel: NSManagedObject {
- @NSManaged var itemName: String
- @NSManaged var quantity: NSNumber
- @NSManaged var price: NSNumber
- }
在我的tableviewcontroller中,静态单元格用于文本字段,我想保存数据:
- import UIKit
- import CoreData
- class NewItemTableViewController: UITableViewController {
- @IBOutlet weak var itemNameTextField: UITextField!
- @IBOutlet weak var itemPriceTextField: UITextField!
- @IBOutlet weak var itemQuantityTextField: UITextField!
- override func viewDidLoad() {
- super.viewDidLoad()
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- @IBAction func saveButton(sender: AnyObject) {
- //CoreData
- let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
- let managedContext : NSManagedObjectContext = appDelegate.managedObjectContext!
- let entity = NSEntityDescription.entityForName("Item",inManagedObjectContext: managedContext)
- var newItem = DataModel(entity: entity!,insertIntoManagedObjectContext: managedContext)
- newItem.itemName = itemNameTextField.text
- //newItem.price = itemPriceTextField.text
- //newItem.quantity = itemQuantityTextField
- managedContext.save(nil)
- self.navigationController?.popToRootViewControllerAnimated(true)
- }
- @IBAction func cancelButton(sender: AnyObject) {
- self.navigationController?.popToRootViewControllerAnimated(true)
- }
在我的tableviewcontroller中,我想在动态单元格中检索数据:
- class ItemListTableViewController: UITableViewController {
- var items : Array<AnyObject> = []
- override func viewDidLoad() {
- super.viewDidLoad()
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- // MARK: - Table view data source
- override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
- // #warning Potentially incomplete method implementation.
- // Return the number of sections.
- return 1
- }
- override func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
- // #warning Incomplete method implementation.
- // Return the number of rows in the section.
- return items.count
- }
- override func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
- let CellID: NSString = "cell"
- var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(CellID) as UITableViewCell
- var data: NSManagedObject = items[indexPath.row] as NSManagedObject
- var itemName = data.valueForKey("itemName") as String
- var price = data.valueForKey("price") as NSNumber
- var quantity = data.valueForKey("quantity") as NSNumber
- cell.textLabel!.text! = "\(itemName)"
- cell.detailTextLabel!.text! = "Price: \(price) - Quantity: \(quantity)"
- return cell
- }
任何帮助我可能会错过在这里的某个概念将不胜感激!谢谢.
解决方法
使用核心数据和tableview时,应该使用NSFetchedResultsController.这本质上是从核心数据中检索数据,并通过section和indexPath进行组织,因此可以方便地将其设置为tableView的数据源.以下是符合NSFetchedResultsControllerDelegate的潜在UITableViewController的完整实现:
- import Foundation
- import UIKit
- import CoreData
- class HomeViewController: UITableViewController,NSFetchedResultsControllerDelegate {
- let managedObjectContext: NSManagedObjectContext? = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext
- var fetchedResultsController: NSFetchedResultsController?
- override func viewDidLoad() {
- super.viewDidLoad()
- fetchedResultsController = NSFetchedResultsController(fetchRequest: allEmployeesFetchRequest(),managedObjectContext: managedObjectContext!,sectionNameKeyPath: nil,cacheName: nil)
- fetchedResultsController?.delegate = self
- fetchedResultsController?.performFetch(nil)
- }
- func allEmployeesFetchRequest() -> NSFetchRequest {
- var fetchRequest = NSFetchRequest(entityName: "Employee")
- let sortDescriptor = NSSortDescriptor(key: "nameLast",ascending: true)
- fetchRequest.predicate = nil
- fetchRequest.sortDescriptors = [sortDescriptor]
- fetchRequest.fetchBatchSize = 20
- return fetchRequest
- }
- //MARK: UITableView Data Source and Delegate Functions
- 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("HomeCell",forIndexPath: indexPath) as UITableViewCell
- if let cellContact = fetchedResultsController?.objectAtIndexPath(indexPath) as? Employee {
- cell.textLabel?.text = "\(cellContact.nameLast),\(cellContact.nameFirst)"
- }
- return cell
- }
- //MARK: NSFetchedResultsController Delegate Functions
- func controller(controller: NSFetchedResultsController,didChangeSection sectionInfo: NSFetchedResultsSectionInfo,atIndex sectionIndex: Int,forChangeType type: NSFetchedResultsChangeType) {
- switch type {
- case NSFetchedResultsChangeType.Insert:
- tableView.insertSections(NSIndexSet(index: sectionIndex),withRowAnimation: UITableViewRowAnimation.Fade)
- break
- case NSFetchedResultsChangeType.Delete:
- tableView.deleteSections(NSIndexSet(index: sectionIndex),withRowAnimation: UITableViewRowAnimation.Fade)
- break
- case NSFetchedResultsChangeType.Move:
- break
- case NSFetchedResultsChangeType.Update:
- break
- default:
- break
- }
- }
- override func tableView(tableView: UITableView,commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath) {
- if editingStyle == .Delete {
- }
- switch editingStyle {
- case .Delete:
- managedObjectContext?.deleteObject(fetchedResultsController?.objectAtIndexPath(indexPath) as Employee)
- managedObjectContext?.save(nil)
- case .Insert:
- break
- case .None:
- break
- }
- }
- func controller(controller: NSFetchedResultsController,didChangeObject anObject: AnyObject,atIndexPath indexPath: NSIndexPath?,forChangeType type: NSFetchedResultsChangeType,newIndexPath: NSIndexPath?) {
- switch type {
- case NSFetchedResultsChangeType.Insert:
- tableView.insertRowsAtIndexPaths(NSArray(object: newIndexPath!),withRowAnimation: UITableViewRowAnimation.Fade)
- break
- case NSFetchedResultsChangeType.Delete:
- tableView.deleteRowsAtIndexPaths(NSArray(object: indexPath!),withRowAnimation: UITableViewRowAnimation.Fade)
- break
- case NSFetchedResultsChangeType.Move:
- tableView.deleteRowsAtIndexPaths(NSArray(object: indexPath!),withRowAnimation: UITableViewRowAnimation.Fade)
- tableView.insertRowsAtIndexPaths(NSArray(object: newIndexPath!),withRowAnimation: UITableViewRowAnimation.Fade)
- break
- case NSFetchedResultsChangeType.Update:
- tableView.cellForRowAtIndexPath(indexPath!)
- break
- default:
- break
- }
- }
- func controllerWillChangeContent(controller: NSFetchedResultsController) {
- tableView.beginUpdates()
- }
- func controllerDidChangeContent(controller: NSFetchedResultsController) {
- tableView.endUpdates()
- }
- }