我在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,我在完成提交后立即添加了一个打印,结果为零。
有什么想法吗?
答案 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()
它不起作用。