[英]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秒或其他时间间隔保存一次数据 viewDidDisappear
或applicationWillResignActive
程序委托中的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.