我使用SQLite.swift与iOS10应用程序中的数据库建立了连接。
我想选择一个特定大学的详细信息,我从另一个视图控制器传入IHE_ID。
我想只选择该特定大学的行,但我无法获得查询。然而,我可以使用prepare循环遍历所有数据,然后从中选择我需要的数据,这当然比我需要的资源更密集,因为我已经从发送视图控制器传入了作为anIHE Int的特定IHE_ID。 / p>
连接正在工作,省略了代码...
do {
let db = try Connection(destinationDBPath, readonly: true)
let IHEs = Table("IHE")
let IHE_ID = Expression<Int>("IHE_ID")
let IHE_Name = Expression<String>("IHE_Name")
let IHE_COE_Url = Expression<String>("IHE_COE_URL")
let IHE_Sector = Expression<Int>("IHE_Sector")
let IHE_COE_Name = Expression<String>("IHE_COE_Name")
for ihe in try db.prepare(IHEs){
if (ihe[IHE_ID] == anIHE){
// build this string, otherwise ignore rest of dataset (doing this because query isn't working)
buildIHE = "Name: \(ihe[IHE_Name])\n"
buildIHE.append("URL: \(ihe[IHE_COE_Url])\n")
// buildIHE.append("Sector: \(ihe[IHE_Sector])\n")
if (ihe[IHE_Sector] == 0) {
buildIHE.append("Sector: Public\n")
} else {
buildIHE.append("Sector: Private\n")
}
buildIHE.append("College of Education Name: \(ihe[IHE_COE_Name])\n")
}
}
print ("Got through building IHE portion of view")
我想做的是使用它而不是for循环。
if let query = IHEs.select(IHE_ID,IHE_Name,IHE_COE_Url,IHE_Sector,IHE_COE_Name).filter(IHE_ID == anIHE){
print("Query successful for \(anIHE) with name \(query[IHE_Name])")
// more actions to build the string I need would then occur
} else {
print("Query has failed or returned nil")
}
最后,如果我可以使查询起作用,我将使用所选元素。 我想我的查询语法可能有问题,但是感谢任何帮助。
带有“if let query”的行在Xcode中出现此错误: 条件绑定的初始化程序必须具有可选类型,而不是“表”。 这让我认为这是我使用.select语句的一些东西,而且只是使用SQLite.swift和swift的新东西。
最后一点是anIHE作为Int进入此函数,IHE_ID是Expression,如此代码所示。我认为这可能是问题的一部分。
答案 0 :(得分:0)
Initializer for conditional binding must have Optional type
错误意味着if let v = expr
语句右侧的表达式不是可选的:使用if是没有意义的,Swift编译器说你应该只写{{ 1}}。
事实上,let v = expr
会返回类型为IHEs.select(...).filter(...)
的非可选值。
它不是您期望的数据库行,因为查询已已定义,但尚未已执行。毕竟,你没有使用Table
:从哪里加载行?
解决方案是恢复数据库连接,并加载一行。这是通过pluck方法完成的。
db