您只是想知道这是否可行,我有一个简单的计数器应用程序,每次按下按钮时计数器变量加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;
}
}
}
答案 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
就会大声朗读它们。