使用Core Data在swift中保存更改的整数

时间:2016-05-20 23:48:37

标签: ios swift core-data int

您只是想知道这是否可行,我有一个简单的计数器应用程序,每次按下按钮时计数器变量加1。当用户使用核心数据退出应用程序时,是否可以保存计数器?我知道NSUserdefaults可以在这里工作,但我正在探索核心数据,并想知道它是否可以在这样的情况下使用

class ViewController: UIViewController {

var counter = Int()


@IBOutlet var label: UILabel!

@IBAction func button(sender: AnyObject) {
    counter += 1
    label.text = "\(counter)"



}
override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.
}
}

NSManagedObject子类错误

class IntegerEntity: NSManagedObject {


convenience init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?, value: Int) {
    self.init(entity: entity, insertIntoManagedObjectContext: context)
    self.value
    // ERROR value of type IntegerEntity has no member value
}
}

ViewController.swift错误

import UIKit
import CoreData

class ViewController: UIViewController {

var counter = Int()


@IBOutlet var label: UILabel!

@IBAction func button(sender: AnyObject) {
    counter += 1
    label.text = "\(counter)"



}
override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext
    var integerEntity: IntegerEntity!
    if dataContext != nil {
        let entity = NSEntityDescription.entityForName("IntegerEntity", inManagedObjectContext: dataContext)
        let request = NSFetchRequest()
        request.entity = entity
        let integer = try? dataContext.executeFetchRequest(request)

        if integer != nil && !integer!.isEmpty {
            (integer?.first! as! IntegerEntity).value = counter
            // ERROR value of type IntegerEntity has no member value
        } else {

            let newInt = IntegerEntity(entity: entity, insertIntoManagedObjectContext: context, value: counter)
            // ERROR Use of unresolved identifier context

            dataContext.saveData()
        }
    }
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext
    var integerEntity: IntegerEntity!
    if dataContext != nil {
        let entity = NSEntityDescription.entityForName("IntegerEntity", inManagedObjectContext: dataContext)
        let request = NSFetchRequest()
        request.entity = entity
        let integer = try? dataContext.executeFetchRequest(request)

        if integer != nil && !integer!.isEmpty {
            counter = (integer!.first! as! IntegerEntity).value
            // ERROR value of type IntegerEntity has no member value
        } else {

            counter = 0
        }
    }


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}
extension NSManagedObjectContext {
func saveData() -> Bool {
    do {
        try self.save()
        return true
    } catch let error as NSError {
        print(error)
        return false;
    }
}
}

1 个答案:

答案 0 :(得分:1)

这是可能的。

首先,创建一个Core Data模型并添加一个名为IntegerEntity的实体。在实体中,添加名为value的属性,其类型为Integer 64。现在生成NSManagedObject子类。

IntegerEntity,swift中,添加以下初始值设定项:

convenience init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?, value: Int) {
    self.init(entity: entity, insertIntoManagedObjectContext: context)
    self.value = value
}

这是因为稍后我们可以直接使用它来创建一个带有值的实体。

我认为您的应用只有一个视图控制器,因此您有两种选择何时保存数据:

  • 使用NSTimer每60秒或其他时间间隔保存数据
  • 在视图控制器中覆盖viewDidDisappear或在app delegate中覆盖applicationWillResignActive

要保存数据,首先需要返回保存的整数(如果存在)。

// Just some boilerplate code here
let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext
var integerEntity: IntegerEntity!
if dataContext != nil {
    let entity = NSEntityDescription.entityForName("IntegerEntity", inManagedObjectContext: dataContext)
    let request = NSFetchRequest()
    request.entity = entity
    let integer = try? dataContext.executeFetchRequest(request)
    // If some integer has already been saved...
    if integer != nil && !integer.isEmpty {
        (integer?.first! as! IntegerEntity).value = counter
    } else {
        // If no integer has been saved before...
        let newInt = IntegerEntity(entity: entity, insertIntoManagedObjectContext: context, value: counter)
        dataContext.saveData()
    }
}

你可能想知道,saveData是什么?我认为我的Xcode版本有一个bug。 Xcode始终坚持save()方法抛出错误并返回Void。所以我创建了这个扩展名:

extension NSManagedObjectContext {
    func saveData() -> Bool {
        do {
            try self.save()
            return true
        } catch let error as NSError {
            print(error)
            return false;
        }
    }
}

和BOOM!那就是它!

"但我如何获取数据?"您询问。实际上,你之前做过!这是代码:

let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext
    var integerEntity: IntegerEntity!
    if dataContext != nil {
        let entity = NSEntityDescription.entityForName("IntegerEntity", inManagedObjectContext: dataContext)
        let request = NSFetchRequest()
        request.entity = entity
        let integer = try? dataContext.executeFetchRequest(request)
        // If some integer has already been saved...
        if integer != nil && !integer.isEmpty {
            counter = (integer!.first! as! IntegerEntity).value.integerValue
        } else {
            // If no integer has been saved before...
            counter = 0
        }
    }

看起来很熟悉?它的代码几乎和以前一样!

<强> 警告

IMO,编写这么多代码只是为了保存一个整数,这是不值得的。请改用用户默认值。如果要浏览Core Data,可以尝试在Core Data中保存单词列表。只需按一下按钮,AVSpeechSynthesizer就会大声朗读它们。