带有Realm的Swift主键的新对象

时间:2016-02-11 19:06:16

标签: swift swift2 realm

背景
我对Swift非常新,但也是一般的编程,所以提前道歉。我唯一真正的数据库体验是MySql,甚至不是那么热。

我通过构建基本目标/习惯跟踪应用来学习Swift + Realm。

任务:
我有一个Goal对象,其中包含一个名为' id'的主键。一个目标可能是减肥'。我还有一个Streak对象,包括每天7次"签到"。用户设定目标,并每天登记。

每个目标可以有多个"条纹"例如在一次7天的冲刺/连胜后,用户可以启动另一个。您还可以有多个目标。为了实现这一点,我试图复制目标的自动递增ID的功能,这也是主键。这也会记录在相应的Streaks中。

我的问题:
我遇到的问题是,当我试图存储另一个目标时,我收到一个错误:

*** Terminating app due to uncaught exception 'RLMException', reason: 'Primary key can't be changed after an object is inserted.'

这是我的AddGoalController中的代码。我已添加评论来解释我的想法。

import UIKit
import RealmSwift

class AddGoalController: UIViewController {

   //set default ID for next goal object
    var newID = 1

//function to determine what the next ID needs to be.
    func getNextID() -> Int{

        let realm = try! Realm()
        let currentGoal = realm.objects(Goal)
//gets maximum ID in the Goal object
        let id = currentGoal.max("id") as Int?
        let goal = id != nil ? currentGoal.filter("id == %@", id!).first : nil
//figure if the query is empty, e.g. no goals at all. If it is not, increment the newID.

            if(goal != nil) {
                newID = goal!.id++
            }

        print(newID)
        return newID
        }

//if a button is pressed...
    @IBAction func goalButton(sender: UIButton) {


        // Generate the newID
        getNextID()

        let goalObj = Goal()
        goalObj.id = newID
        goalObj.Title = setGoal.text!
        goalObj.Aim = ""
        goalObj.Action = setHabit.text!
        goalObj.Active = 1

        // Get the default Realm
        let realm = try! Realm()
        // You only need to do this once (per thread)

        // Add to the Realm inside a transaction
        try! realm.write {
            realm.add(goalObj, update: true)
}

事实上,即使我对按钮中的所有内容进行了评论并且只有getNextID(),我仍然会得到同样的错误。

我的问题是:

1.是否有一种更优雅的方式来实现我的目标,即实现多个条纹的目标。只有最新的连胜才有效。
2。是什么导致了这个错误?


非常感谢提前

1 个答案:

答案 0 :(得分:3)

newID不应该是实例变量,应该从您的函数返回。

您还需要将newID = goal!.id++更改为newID = (goal!.id + 1),以便您不编辑该值,您需要获取该值并在结果中添加一个,而不是添加一个然后获取值。