使用 swiftyJSON 和 sqlite.swift 将基于 json 的数据添加到 sqlite 数据库中
add json-based data into a sqlite database using swiftyJSON and sqlite.swift
请耐心等待这是我的第一个 swift 项目,我还没有跟上 syntax/language 的速度。
我使用 AlamoFire 从 Web 服务检索数据并使用 SwiftyJson 解析它。然后我想使用 SQLite.swift.
将它插入到本地 SQLite 数据库中
到目前为止,AlomoFire、SwiftyJson 和 SQLite.swift 已安装并在我的项目中运行,令我惊讶的是事情进展顺利 ;)
现在我的问题。我得到的数据在 JSON 中,在一个数组中所以我想这样做:
let companiesTable = db["companies"] // get the table from our SQLite Database
db.transaction(.Deferred) { txn in
for (index,company) in data {
if companiesTable.insert(name <- company["name"]!), shortname <- company["short_name"]).statement.failed {
return .Rollback
}
}
return .Commit
}
我的问题出在插入中。我必须使用 ! 强制展开,这对于名称(数据库中的必需列)是可以的,但对于短名称或其他十几个列(为简单起见在上面的示例中未提及)可能是 empty/null .当然,只应插入具有值的列。
第二个问题。我在 Whosebug 上找到了有关事务的内容,在执行 'return'
时事务是自动提交还是回滚
你问:
My problem is in the insert. I have to force unwrap using a !, which is ok for name (required column in the database), but not ok for shortname or a dozen other columns (not mentioned in the example above for simplicity) which may be empty/null.
如果像shortname
这样的字段可以是empty/null,那么相应地定义它:
let company = db["companies"]
let name = Expression<String>("name")
let shortname = Expression<String?>("short_name")
当你这样做时,当你插入数据时,如果 short_name
存在,它会使用它,如果不存在,它将是 NULL
在数据库中:
let data = [
(1, ["name": "United States of America", "short_name": "US"]),
(2, ["name": "United Kingdom", "short_name": "UK"]),
(3, ["name": "France"])]
let companiesTable = db["companies"] // get the table from our SQLite Database
db.transaction(.Deferred) { txn in
for (index,company) in data {
if companiesTable.insert(name <- company["name"]!, shortname <- company["short_name"]).statement.failed {
return .Rollback
}
}
return .Commit
}
你接着问:
Second question. I found the stuff about transactions here on Whosebug, is the transaction automatically Committed or Roll-backed when doing the 'return'
如果您使用的是 transaction
方法,它是提交还是回滚取决于您 TransactionResult
的值 return。在此示例中,如果您 return .Commit
,它将提交,如果您 return .Rollback
,它将回滚。
请耐心等待这是我的第一个 swift 项目,我还没有跟上 syntax/language 的速度。
我使用 AlamoFire 从 Web 服务检索数据并使用 SwiftyJson 解析它。然后我想使用 SQLite.swift.
将它插入到本地 SQLite 数据库中到目前为止,AlomoFire、SwiftyJson 和 SQLite.swift 已安装并在我的项目中运行,令我惊讶的是事情进展顺利 ;)
现在我的问题。我得到的数据在 JSON 中,在一个数组中所以我想这样做:
let companiesTable = db["companies"] // get the table from our SQLite Database
db.transaction(.Deferred) { txn in
for (index,company) in data {
if companiesTable.insert(name <- company["name"]!), shortname <- company["short_name"]).statement.failed {
return .Rollback
}
}
return .Commit
}
我的问题出在插入中。我必须使用 ! 强制展开,这对于名称(数据库中的必需列)是可以的,但对于短名称或其他十几个列(为简单起见在上面的示例中未提及)可能是 empty/null .当然,只应插入具有值的列。
第二个问题。我在 Whosebug 上找到了有关事务的内容,在执行 'return'
时事务是自动提交还是回滚你问:
My problem is in the insert. I have to force unwrap using a !, which is ok for name (required column in the database), but not ok for shortname or a dozen other columns (not mentioned in the example above for simplicity) which may be empty/null.
如果像shortname
这样的字段可以是empty/null,那么相应地定义它:
let company = db["companies"]
let name = Expression<String>("name")
let shortname = Expression<String?>("short_name")
当你这样做时,当你插入数据时,如果 short_name
存在,它会使用它,如果不存在,它将是 NULL
在数据库中:
let data = [
(1, ["name": "United States of America", "short_name": "US"]),
(2, ["name": "United Kingdom", "short_name": "UK"]),
(3, ["name": "France"])]
let companiesTable = db["companies"] // get the table from our SQLite Database
db.transaction(.Deferred) { txn in
for (index,company) in data {
if companiesTable.insert(name <- company["name"]!, shortname <- company["short_name"]).statement.failed {
return .Rollback
}
}
return .Commit
}
你接着问:
Second question. I found the stuff about transactions here on Whosebug, is the transaction automatically Committed or Roll-backed when doing the 'return'
如果您使用的是 transaction
方法,它是提交还是回滚取决于您 TransactionResult
的值 return。在此示例中,如果您 return .Commit
,它将提交,如果您 return .Rollback
,它将回滚。