使用swiftyJSON和sqlite.swift将基于json的数据添加到sqlite数据库中

时间:2015-07-26 19:02:50

标签: ios json swift swifty-json sqlite.swift

请耐心等待,这是我的第一个快速项目,我还没有达到语法/语言的速度。

我使用AlamoFire从Web服务检索数据并使用SwiftyJson解析它。然后我想使用SQLite.swift将它插入到本地SQLite数据库中。

到目前为止,AlomoFire,SwiftyJson和SQLite.swift已经安装并在我的项目中工作,事情变得非常顺利让我惊讶;)

现在我的问题。我得到的数据是JSON,在一个数组中,所以我想这样做:

return

我的问题出在插页中。我必须使用!来强制解包,这对于名称(数据库中的必需列)是可以的,但对于短名称或其他十几个列(上面的示例中未提及,为简单起见)可能是空的/ null。当然,只应插入带有值的列。

第二个问题。我在stackoverflow上找到了关于事务的东西,当执行'return'时,事务是自动Committed或Roll-backed

1 个答案:

答案 0 :(得分:2)

你问:

  

我的问题出在插页中。我必须使用!来解压缩,这对于名称(数据库中的必需列)是可以的,但对于短名称或其他十几个列(上面的示例中未提及,为简单起见)可能是空的/ null。 / p>

如果像shortname这样的字段可以为空/ 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
}

然后你问:

  

第二个问题。我在stackoverflow上找到了关于事务的东西,在执行&#39; return&#39;

时,事务是自动Committed或Roll-backed

如果您正在使用transaction方法,则无论是提交还是回滚,都是您返回的TransactionResult值的函数。在此示例中,如果您返回.Commit,它将提交,如果您返回.Rollback则返回。