【问题标题】:CoreData - storing an integer that updates on button tapCoreData - 存储在按钮点击时更新的整数
【发布时间】:2016-09-15 12:00:59
【问题描述】:

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

查看已点击(增加计数器,并保存到 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 是否是不好的做法?

【问题讨论】:

  • 如果你想要坚持的唯一东西就是计数器,你为什么不直接使用 NSUserDefaults 而不是将 CoreData 堆栈引入应用程序?
  • @Eugenezhenya Gordin - 简短的回答是我只想练习 coredata。谢谢你的建议!

标签: ios swift core-data int


【解决方案1】:

在 viewDidLoad 中,您将 counterOutlet.text 设置为名称。 您还必须将计时器设置为名称。 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.")
}
}

【讨论】:

    【解决方案2】:

    你在'tapGestureRecognizerTapped'方法中编写了错误的代码,你不应该每次点击后都将新对象插入核心数据库。当插入的对象计数为零时,我建议在“viewDidLoad”中插入一次对象,否则不要插入。现在您必须将保存的值放入 CoreDatabse 并更新该值并将其保存回来。

    【讨论】:

    • 介意用我应该尝试完成的代码发布答案吗?尽我所能解决这个 CoreData 学习曲线。谢谢!
    【解决方案3】:

    您正在保存和获取数据 - 但您没有使用以前保存的数据来更新 timer 的值。所以它每次都从零开始,因为在应用启动时你没有告诉它是什么。

    如果您打算在获取后遍历所有条目,则可以通过在循环中添加如下一行来获取 timer 的值:

    if name > timer {
        timer = name
    }
    

    然后timer 将获得最大保存值,并从那里开始计数。如果您不打算遍历所有条目,则可以在获取的数组上使用reduce 来查找最大值。

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

    【讨论】:

    • 我只想要一个值。在阅读了您的评论和桑托什的评论后,看起来我做错了。我只需要添加一次对象,并将其值更新为 CD。正确的? - 编辑:我用你的 if 语句编辑了我上面的问题。这修复了计数器重置为零的错误,但是,我仍然需要修复这个问题,以便 CD 高效。
    • 您能否提供有关如何防止为每个值创建新条目的任何代码指导?我只想要存储在 CD 中的单个值,该值每次都会更新。谢谢!
    • 您知道如何执行获取请求。获取现有条目并查看它是什么。然后更改该值并保存更改。
    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多