用数据库数据填充数组并在pickerView上调用它
Posted
技术标签:
【中文标题】用数据库数据填充数组并在pickerView上调用它【英文标题】:Populating array with database data and calling it on pickerView 【发布时间】:2019-12-09 03:51:26 【问题描述】:我需要使用数据库中的数据填充数组。当我这样做时,我从我的 pickerView 函数中收到一条错误消息。之前,我将这个数组硬编码如下,现在我希望它来自数据库查询。
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()
在pickerView中
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
return recomendMedsTypes[row]
在这里我收到错误“无法将‘Any’类型的返回表达式转换为‘String’类型的返回表达式?’。如何设计数组和返回查询数据的调用?查询应返回药物列表。
【问题讨论】:
【参考方案1】:你为什么要声明方法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
【讨论】:
以上是关于用数据库数据填充数组并在pickerView上调用它的主要内容,如果未能解决你的问题,请参考以下文章
可以创建一个返回带有数据的 PickerView 的函数吗?