2016-11-25 214 views
0

我保存的锻炼到核心数据,把它插入表中,这部作品在携带来自用户输入的信息到表中的条款,但是coredata犯规持续存在,因此当我重新打开应用程序时,该条目丢失。核心数据不会持续吗?

它实际上是工作昨天似乎已经打破,但我还没有做出改变,将尽可能实现这种作为即时通讯知道。我在调试时发现的一件事是,当我加载应用程序时,它的意思是指向我的控制台中的sql数据库,但是它已更改为.configurationprofiles文件?这可能是一个原因,修复会是什么?我将包含tableview的代码和下面的用户输入表单的代码来显示信息流。让我知道是否需要添加任何其他数据。

enter image description here

import Foundation 
import UIKit 
import CoreData 

class ExerciseEditorController: UIViewController, UITextFieldDelegate { 

    var managedObjectContext: NSManagedObjectContext? 

    var userRepsCount = Int() 
    var userSetsCount = Int() 

    @IBOutlet weak var userExerciseName: UITextField! 
    @IBOutlet weak var userExerciseSetCounter: UILabel! 
    @IBOutlet weak var userExerciseRepsCounter: UILabel! 
    @IBOutlet weak var userExerciseWeight: UITextField! 

    @IBAction func userSetsStepper(_ sender: UIStepper) { 
     userExerciseSetCounter.text = Int(sender.value).description 
     self.userSetsCount = Int(sender.value) 
    } 

    @IBAction func userRepsStepper(_ sender: UIStepper) { 
     userExerciseRepsCounter.text = Int(sender.value).description 
     self.userRepsCount = Int(sender.value) 
    } 

    @IBAction func cancelExerciseEditor(_ sender: Any) { 
     self.performSegue(withIdentifier: "unwindToWorkoutDesignerWithSegue:", sender: self) 
    } 

    @IBAction func saveExerciseToWorkout(_ sender: Any) { 

     createExercise() 
     self.performSegue(withIdentifier: "unwindToWorkoutDesignerWithSegue:", sender: self) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.backgroundColor = (UIColor.customBackgroundGraphite()) 

     userExerciseSetCounter.text = String(userSetsCount) 
     userExerciseRepsCounter.text = String(userSetsCount) 
     userExerciseWeight.delegate = self 
     userExerciseWeight.keyboardType = .numbersAndPunctuation 

    } 

    func createExercise() { 
     let userExerciseWeightSet = Double(self.userExerciseWeight.text!) //make this safe! 

     guard let managedObjectContext = managedObjectContext else { return } 

     let userExercise = UserExercise(context: managedObjectContext) 

     userExercise.name = userExerciseName.text 
     userExercise.sets = Int64(userSetsCount) 
     userExercise.reps = Int64(userRepsCount) 
     userExercise.weight = userExerciseWeightSet! //make this safe! 
     userExercise.createdAt = Date().timeIntervalSince1970 

    } 

    func animateTextField(textField: UITextField, up: Bool) { 
     let movementDistance:CGFloat = -130 
     let movementDuration: Double = 0.3 
     var movement:CGFloat = 0 
     if up { 
      movement = movementDistance 
     } 
     else { 
      movement = -movementDistance 
     } 

     UIView.beginAnimations("animateTextField", context: nil) 
     UIView.setAnimationBeginsFromCurrentState(true) 
     UIView.setAnimationDuration(movementDuration) 
     self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement) 
     UIView.commitAnimations() 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 
     self.animateTextField(textField: textField, up:true) 
    } 

    func textFieldDidEndEditing(_ textField: UITextField) { 
     self.animateTextField(textField: textField, up:false) 
    } 

} 

而这正是实现代码如下:

import Foundation 
import UIKit 
import CoreData 

class WorkoutDesignerController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate { 

    @IBAction func unwindToWorkoutDesigner(segue: UIStoryboardSegue) {} 
    @IBOutlet weak var workoutDesignerTable: UITableView! 
    @IBOutlet weak var tapToAddExercise: UILabel! 
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView! 
    @IBAction func cancelWorkoutDesigner(_ sender: Any) { 
     self.performSegue(withIdentifier: "unwindToTemplatesWithSegue", sender: self) 
    } 

    private let persistentContainer = NSPersistentContainer(name: "Lift") 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     setupView() 
     workoutDesignerTable.delegate = self 
     workoutDesignerTable.dataSource = self 

     view.backgroundColor = (UIColor.customBackgroundGraphite()) 

     persistentContainer.loadPersistentStores { (persistentStoreDescription, error) in 
      if let error = error { 
       print("Unable to Load Persistent Store") 
       print("\(error), \(error.localizedDescription)") 

      } else { 
       self.setupView() 

       do { 
        try self.fetchedResultsController.performFetch() 
       } catch { 
        let fetchError = error as NSError 
        print("Unable to Perform Fetch Request") 
        print("\(fetchError), \(fetchError.localizedDescription)") 
       } 

       self.updateView() 
      } 
     } 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     guard let userExercises = fetchedResultsController.fetchedObjects else { return 0 } 
     return userExercises.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? RoutineTableViewCell else { 
      fatalError("Unexpected Index Path") 
     } 

     cell.backgroundColor = UIColor.customBackgroundGraphite() 
     cell.textLabel?.textColor = UIColor.white 

     let userExercise = fetchedResultsController.object(at: indexPath) 

     cell.nameLabel.text = userExercise.name 
     cell.repsLabel.text = String(userExercise.reps) 
     cell.setsLabel.text = String(userExercise.sets) 
     cell.weightLabel.text = String(userExercise.weight) 

     return cell 
    } 

    private func setupView() { 
     setupMessageLabel() 
     updateView() 
    } 

    private func setupMessageLabel() { 
     tapToAddExercise.text = "Tap + To Add An Exercise To The Routine" 
    } 

    fileprivate func updateView() { 
     var hasUserExercises = false 
     if let UserExercise = fetchedResultsController.fetchedObjects { 
      hasUserExercises = UserExercise.count > 0 
     } 
     workoutDesignerTable.isHidden = !hasUserExercises 
     tapToAddExercise.isHidden = hasUserExercises 

     activityIndicatorView.stopAnimating() 
    } 

    fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserExercise> = { 

     // Create Fetch Request 
     let fetchRequest: NSFetchRequest<UserExercise> = UserExercise.fetchRequest() 

     // Configure Fetch Request 
     fetchRequest.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: true)] 

     // Create Fetched Results Controller 
     let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.persistentContainer.viewContext, sectionNameKeyPath: nil, cacheName: nil) 

     // Configure Fetched Results Controller 
     fetchedResultsController.delegate = self 

     return fetchedResultsController 
    }() 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "addNewExerciseSegue" { 
      if let destinationViewController = segue.destination as? ExerciseEditorController { 
       // Configure View Controller 
       destinationViewController.managedObjectContext = persistentContainer.viewContext 
      } 
     } 
    } 

    func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
     workoutDesignerTable.beginUpdates() 
    } 

    func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
     workoutDesignerTable.endUpdates() 

     updateView() 
    } 

    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { 
     switch (type) { 
     case .insert: 
      if let indexPath = newIndexPath { 
       workoutDesignerTable.insertRows(at: [indexPath], with: .fade) 
      } 
      break; 
     default: 
      print("...") 
     } 
    } 

} 
+1

为了使数据持久化,你必须保存管理对象上下文。 – vadian

+0

这是保存按钮功能saveexercise中实现的功能吗? – infernouk

+0

不,您正在创建实例,但不保存上下文。某处你必须调用'context.save()' – vadian

回答

0

你需要调用context.save()