CoreData - 存储一个在按钮点击时更新的整数

时间:2016-05-18 20:04:53

标签: ios swift core-data int

我是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.")
    }
}

我的数据模型 xcdatamodel

当我第一次加载应用程序时,计数器为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是不好的做法吗?

3 个答案:

答案 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来查找最大值。

每次保存值是好还是坏取决于您的应用应该做什么。您想要每个值的条目,还是只需一个值?在前一种情况下,这很好,但在后一种情况下,您可以创建您不需要的条目。