繁体   English   中英

使用核心数据快速保存变化的整数

[英]Use Core Data to save a changing integer in swift

您好,我只是想知道这是否可行,我有一个简单的计数器应用程序,每按一次按钮,计数器变量就会增加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;
    }
}
}

这个有可能。

首先,创建一个核心数据模型并添加一个称为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秒或其他时间间隔保存一次数据
  • 覆盖视图控制器中的viewDidDisappearapplicationWillResignActive程序委托中的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版本有错误。 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,仅保存一个整数就写太多代码是不值得的,这就是您所知道的。 请改用用户默认值。 如果要浏览核心数据,可以尝试在核心数据中保存单词列表。 只需按下一个按钮, AVSpeechSynthesizer就会大声朗读它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM