用数据库数据填充数组并在选取器视图上调用它



我需要使用数据库中的数据填充数组。当我这样做时,我从我的选择器视图函数收到一条错误消息。以前,我把这个数组硬编码如下,现在我希望它来自数据库查询。

var recomendMedsTypes = ["Advil","Aleve", "Ibuprofen","Tylenol"]

我不确定我的阵列设计是否正确。数组是从基于以下简单类的函数填充的

class Medicine {
var dawa: String
init(dawa: String) {
self.dawa = dawa
}
}

我填充了此类的实例,如下所示

var medname = [Medicine]()

这是填充数组的函数

func readMedName() -> Array<Any>{
//get data from this query
let queryString = "SELECT drugName FROM otc"
//statement pointer
var stmt2:OpaquePointer?
//preparing the query
if sqlite3_prepare(db, queryString, -1, &stmt2, nil) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing read: (errmsg)")
//return errmsg
}
//go through all the records
while(sqlite3_step(stmt2) == SQLITE_ROW){
let drugname = String(cString: sqlite3_column_text(stmt2,0))
// populate array
medname.append(Medicine(dawa: String(describing: drugname)))
}
return medname
}

这是我尝试从查询填充数组

var recomendMedsTypes = readMedName()

在选取器视图中

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return recomendMedsTypes[row]
}

在这里,我收到错误"无法将类型'Any'的返回表达式转换为返回类型'字符串?如何设计数组和调用以返回查询数据?查询应返回药物列表。

为什么你声明方法的返回类型Array<Any>,尽管你清楚地知道这是Array< Medicine>又名[Medicine]

在 Swift 中,声明类型尽可能具体。

func readMedName() -> [Medicine] {

顺便说一下,由于medname是在方法外部声明的,因此返回值是多余的

func readMedName() {
...
// return medname
}

这修复了错误,但你会得到另一个。您必须从titleForRow返回一个字符串,在您的情况下dawa属性

return recomendMedsTypes[row].dawa

并且请不要通过描述字符串来创建字符串。这毫无意义

medname.append(Medicine(dawa: drugname))

最后,很可能你不需要一个类,一个结构就足够了,你可以免费获得初始化项。如果dawa没有改变,则声明它为常量

struct Medicine {
let dawa: String
}

最新更新