iOS Swift - SharkORM不会提交

时间:2017-03-23 17:03:53

标签: ios swift

我在iOS Swift项目中使用SharkORM,我遇到了特定对象的问题。我在项目中有其他对象,但是这个。

我的班级是这样的:

import Foundation
import SharkORM

class Exam: SRKObject {

    dynamic var serverId: NSNumber?
    dynamic var type: String?
    dynamic var when: String?
    dynamic var file: String?
    dynamic var filename: String?
    dynamic var url: String?

    func toJson() -> [String:Any?] {
        return [
            "name" : type,
            "date" : when,
            "serverId" : serverId,
            "file" : file,
            "filename" : filename,
            "url" : url,
            "id" : id
        ]
    }

    static func fromJson(_ json: [String:Any?]) -> Exam {
        let exam = Exam()
        exam.id = json["id"] as? NSNumber ?? NSNumber(value: 0)
        exam.type = json["name"] as? String ?? ""
        exam.file = json["file"] as? String ?? ""
        exam.filename = json["filename"] as? String ?? ""
        exam.url = json["url"] as? String ?? ""
        exam.serverId = json["serverId"] as? NSNumber ?? NSNumber(value: 0)
        exam.when = json["date"] as? String ?? ""
        return exam
    }

}

我添加了一个需要保存的数组对象,在用户按下保存按钮后,应用程序开始提交它。

    // save exams
    for exam in self.examsToSave {
        if !exam.commit() {
            print("Error commiting exam.")
        }
    }
    if let rs = Exam.query().fetch() {
        print("exams: \(rs.count)")
    }

commit方法返回true,我在完成提交后立即添加了一个打印,结果为零。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

发布后我发现了问题。在我的文字中,我的变量“when”被着色为关键字。我刚刚将名称更改为“whenDate”并开始提交。很奇怪它没有出现任何错误或崩溃。无论如何,SRKObject中不允许使用名为“when”的变量。

答案 1 :(得分:1)

给出相同的提交问题,最好在此处保持话题。而且我花了很多时间尝试调试它,以为我会尝试:

我有一个简单的类(并且过度简化,但按此处提供的方法进行了测试):

class user: SRKObject {
    @objc dynamic var name: String = ""
}

(不,对象属性名称上没有奇怪的语法颜色。)

然后执行以下操作(简化的测试用例),首先定义

public var currUser = user()

然后使用函数:

let users = user.query().fetch() as! [user]
if users.count > 0 {
    currUser = users[0]
    NSLog("Num users \(users.count) name \(currUser.name)")
} else {
    self.currUser.name = "T1 User"
    if !self.currUser.commit() {
        print ("Failed to commit")
    }
    else {
        let u = user.query().fetch()
        print("Num users \(u.count)")
    }
}

commit()调用成功-至少我没有收到“提交失败”消息。但是,我在最后一个fetch()中得到了零计数。

从“ SQLite的数据库浏览器”中查看数据库文件(在Simulator中)显示该数据库已创建好,但其中没有“用户”记录,“提交的”数据也没有。

顺便说一句,当我在SRKTransaction.transaction中有此代码时,它DID落入了故障(回滚)块,所以是的,确实出现了事务错误,但接下来将进行跟踪。

在此之前,请先感谢您提供的针对此案例的任何帮助均应起作用。

答案 2 :(得分:0)

@ retd111,我复制并粘贴了您的代码,并得到了相同的错误。

然后,我将currUser移至本地变量,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()

    var currUser: user? = nil

    let users = user.query().fetch() as! [user]
    if users.count > 0 {
        currUser = users[0]
        NSLog("Num users \(users.count) name \(currUser!.name)")
    } else {
        currUser = user()
        currUser!.name = "T1 User"
        if !currUser!.commit() {
            print ("Failed to commit")
        }
        else {
            let u = user.query().fetch()
            print("Num users \(u?.count ?? 0)")
        }
    }

}

它可以正常工作。

由于某种原因,如果您将currUser实例化为类成员变量,例如:

public var currUser = user()

它不起作用。