在SQLite.swift中使用Filters中的变量

时间:2015-03-15 00:14:57

标签: xcode swift sqlite.swift

我在我的应用中使用SQLite.swift (Branch Swift-1-2)在XCode 6.3 beta中。 我能够创建数据库/表并在表中插入条目。

到目前为止一切顺利。

现在,当我有一个简单的场景如下:

class Foo {
   var id: Int?
   var name: String?
   /* constructor to create an instance ... */
}

// This is how the table column is defined
var id = Expression<Int64>("id")

// Function to update data in the table
func updateFoo(foo: Foo) -> Int? {
    // 'foos' is the table name
    let candidateFoo = foos.filter(super.id == foo.id!) //<----ERROR!!!
    let (rowsUpdated, statement) = candidateFoo.update(name <- foo.name!)

    if  let rowsUpdated = rowsUpdated {
        println("Succesfully updated \(rowsUpdated) row(s)")
        return rowsUpdated
    } else if statement.failed {
        println("Update failed. Reason: \(statement.reason)")
    }

    return nil
}

在注释\\ <----ERROR!!!的行上,我收到编译时错误: 二元运算符&#39; ==&#39;不能应用于Expression&lt;类型的操作数Int64&gt;和Int

如果我在该行上直接使用Int,则可以正常使用。例如

let candidateFoo = foos.filter(super.id == 3) // No Error!

但是,如果我只是这样做,它会再次出现同样的错误:

var i = 3
let candidateFoo = foos.filter(super.id == i) // <----ERROR!!!

我理解错误是什么,但我无法解决它。我看着documentation,但我仍然被卡住了。所以任何帮助都表示赞赏。

更新:

将变量明确声明为Int64可以解决问题:

var i:Int64 = 3
let candidateFoo = foos.filter(super.id == i) // No Error!

现在我想知道是否必须更改我的类定义,这将需要在代码中的多个位置进行更改。另外official swift documentation建议使用Int,除非需要明确的大小。

  

除非使用字大小的Int类型来存储整数值   您需要具有特定大小或签名的类型。

此外,SQLite.swift文档指出:

  

虽然Int64是基本的原始类型(用于保留64位整数)   32位平台),Int和Bool透明地工作。

因此,我应该在我的类定义中明确使用Int64,因为它映射到数据库?

1 个答案:

答案 0 :(得分:2)

您将Foo结构直接映射到SQL中的基础类型,因此您应该在两个位置使用相同的类型。如果在32位设备上需要64位精度(以避免溢出等),则应使用Int64。如果您不担心,请使用Int这两个地方:

var id = Expression<Int>("id")
  

如果我在该行上直接使用Int,则可以正常工作。例如

这是因为它实际上是一个Int64,它符合IntegerLiteralConvertible所以推断了文字的基础类型(你可以在这里阅读更多关于Swift文字可转换的内容:http://nshipster.com/swift-literal-convertible/)。

  

所以我应该在我的类定义中明确地使用Int64,因为它映射到DB?

请记住,SQLite.swift表达式层使您可以灵活地引用您想要的基础列类型(假设您conform it to its Value protocol),所以再次:您可以自由地使用Int如果这就是你在整个代码中处理价值的方式。

除此之外,当你在Swift中使用不同的整数类型时,你可以将它们内联。 E.g。

let candidateFoo = foos.filter(super.id == Int64(foo.id!))