CoreData不存在?

时间:2016-11-25 15:22:09

标签: swift core-data

我正在将练习保存到核心数据中并将其调用到表中,这可以将信息从用户输入传递到表中,但是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 个答案:

答案 0 :(得分:0)

您需要致电context.save()