我是CoreData的新手。我建立了一个非常简单的计数器界面,每次点击视图时,它会将数字增加1。非常直截了当。需要实现CoreData,以便下次打开时数字仍然存在。
这是我的代码
班级属性
var timer = Int()
var name = Int()
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
viewDidLoad中
override func viewDidLoad() {
super.viewDidLoad()
let context: NSManagedObjectContext = appDel.managedObjectContext
do {
let request = NSFetchRequest(entityName: "Model")
let results = try context.executeFetchRequest(request)
for item in results{
let name = item.valueForKey("counter") as! Int
print("The counter # saved in Core Data is: \(name)")
counterOutlet.text = "\(name)"
// Updated
if name > timer {
timer = name
}
}
}
catch {
print("Error retrieving from Core Data.")
}
}
查看Tapped(增加计数器,并保存到CD
@IBAction func tapGestureRecognizerTapped(sender: UITapGestureRecognizer) {
timer += 1
print(timer)
counterOutlet.text = "\(timer)"
let context: NSManagedObjectContext = appDel.managedObjectContext
// Add stuff to CD
let mySavedCounter = NSEntityDescription.insertNewObjectForEntityForName("Model", inManagedObjectContext: context)
mySavedCounter.setValue(timer, forKey: "counter")
// Add the info to the entity!
do {
try context.save()
}
catch {
print("Error saving to Core Data.")
}
}
当我第一次加载应用程序时,计数器为0(应该是。)我可以点击视图将计数器递增1.工作正常。
当我努力关闭应用程序时,我重新打开它,看到我留下的价值仍然存在! (太棒了!)控制台日志显示以下内容:(一旦我达到15,我关闭了应用程序。)
The counter # saved in Core Data is: 1
The counter # saved in Core Data is: 2
The counter # saved in Core Data is: 3
The counter # saved in Core Data is: 4
The counter # saved in Core Data is: 5
The counter # saved in Core Data is: 6
The counter # saved in Core Data is: 7
The counter # saved in Core Data is: 8
The counter # saved in Core Data is: 9
The counter # saved in Core Data is: 10
The counter # saved in Core Data is: 11
The counter # saved in Core Data is: 12
The counter # saved in Core Data is: 13
The counter # saved in Core Data is: 14
The counter # saved in Core Data is: 15
现在我需要调试的问题:
点击视图后,计数器将重置为0,并从那里开始递增。不应该从15增加,因为它应该!
如何修复此错误以使计数器增加到保存的数字(在本例中为15)。此外,我创建了一个NSManagedObject子类,但似乎没有使用它。上面的代码是使用几个youtube教程创建的。可以通过使用子类来优化此代码吗?每次点击视图时将此计数器保存到CD是不好的做法吗?
答案 0 :(得分:1)
在viewDidLoad中,将counterOutlet.text设置为name。 您还必须将计时器设置为name。 viewDidLoad中更新的代码如下所示:
override func viewDidLoad() {
super.viewDidLoad()
let context: NSManagedObjectContext = appDel.managedObjectContext
do {
let request = NSFetchRequest(entityName: "Model")
let results = try context.executeFetchRequest(request)
for item in results{
let name = item.valueForKey("counter") as! Int
print("The counter # saved in Core Data is: \(name)")
counterOutlet.text = "\(name)"
timer = name
}
}
catch {
print("Error retrieving from Core Data.")
}
}
答案 1 :(得分:0)
你有错误的代码写在' tapGestureRecognizerTapped'方法,每次点击后都不应该将新对象插入核心数据库。我建议在&view; viewDidLoad'中插入一次对象。当插入的对象计数为零时,否则不要插入。现在,您必须将保存的值保存到CoreDatabse中并更新值并将其保存回来。
答案 2 :(得分:0)
您正在保存和提取数据 - 但您未使用以前保存的数据来更新timer
的值。因此,它每次都从零开始,因为当应用程序启动时,您不会将其告知其他任何内容。
如果您计划在获取后循环遍历所有条目,则可以通过在循环中添加这样的行来获取timer
的值:
if name > timer {
timer = name
}
然后timer
将获得最大保存值,并从那里开始计数。如果您不打算遍历所有条目,则可以在获取的数组上使用reduce
来查找最大值。
每次保存值是好还是坏取决于您的应用应该做什么。您想要每个值的条目,还是只需一个值?在前一种情况下,这很好,但在后一种情况下,您可以创建您不需要的条目。