我在我的应用中使用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
,因为它映射到数据库?
答案 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!))