我正试图从SQL Server中提取数据,我无法存储数据。我得到所有行,但"外面"的函数,我的数据是零。这意味着在我从数据库断开连接之前,我有数据,但是当我关闭连接时,所有数据都消失了。
我认为这是因为我有浅拷贝,我需要深拷贝
import Foundation
import SQLClient
class RecipeViewModel{
var recipes = [Recipe]()
init(){
getRecipeFromDB()
}
func getRecipeFromDB(){
let client = SQLClient.sharedInstance() as! SQLClient
client.connect("x.x.x.x", username: "xx", password: "xxx", database: "xxx") {
success in
client.execute("SELECT item FROM TABLE") {
results in
for table in results as! [[[String:AnyObject]]] {
for row in table {
for (columnName, value) in row {
let recipe = Recipe(code: value as! String, title: "Title")
recipes.append(recipe)
}
}
}
// prints all recipes. Everything is perfect
for i in self.recipes{
print(i.code)
}
client.disconnect()
}
//prints nothing. recipe.count = 0
for i in self.recipes{
print(i.code)
}
}
}
func error(error: String!, code: Int32, severity: Int32) {
print(error)
}
}
我认为这是因为您在闭包之后执行打印食谱。由于函数中的闭包不是按顺序运行的,因此不应该在闭包函数之后立即读取数据(不能保证闭包将在外部函数下面的下一条语句之前执行)。您必须使用completion
闭包来存档您的目标。
func getRecipeFromDB(completion: ([Recipe]) -> Void){
let client = SQLClient.sharedInstance() as! SQLClient
client.connect("x.x.x.x", username: "xx", password: "xxx", database: "xxx") {
success in
client.execute("SELECT item FROM TABLE") {
results in
for table in results as! [[[String:AnyObject]]] {
for row in table {
for (columnName, value) in row {
let recipe = Recipe(code: value as! String, title: "Title")
recipes.append(recipe)
}
}
}
// prints all recipes. Everything is perfect
for i in self.recipes{
print(i.code)
}
client.disconnect()
// This is important to invoke the callback when reading data is done
completion(self.recipes)
}
}
}
// Call your query data with a completion
getRecipeFromDB {
(data) in
for i in data{
print(i.code)
}
}
在桥接头文件中,导入"SQLClient.h",从这里您可以构建项目,所有内容都应该可以编译。然后,您可以像上面那样创建SQLClient对象,并在.connect中确保完成处理程序检查它是否成功,然后在闭包中可以调用client。如果你把一个SQL命令作为字符串,并在.execute完成块中使用data作为变量,如果你打印这个数据变量,你将从SQL Server返回所有数据。它返回JSON,所以从这里你可以使用JSON序列化转换。
如果你有任何问题,请随时给我发消息,我会返回我的代码看起来像一个截图,这样它可能会帮助你!