我试图简单地存储和检索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() } }