gpt4 book ai didi

ios - 如何使用SQLite.swift类型安全API链接条件?

转载 作者:行者123 更新时间:2023-12-01 16:20:12 26 4
gpt4 key购买 nike

我正在使用SQLite.swift,并且希望在类型安全的API中表示具有多个动态过滤条件的SQL语句。我发现了类似的问题,但是没有一个人对如何实现这个问题提供了任何见解。

到目前为止,我基本上会像这样构建查询(请注意,我的部分或全部TextField可能为空):

var filters: [String] = ["id != 0"]
if nameFilterTextField.text?.count ?? 0 > 0 {
filters.append("(firstName LIKE '\(nameFilterTextField.text ?? "")' OR lastName LIKE '\(nameFilterTextField.text ?? ""))'")
}
if(dateFromTextField.text?.count ?? 0 > 0 && dateToTextField.text?.count ?? 0 > 0){
let startdate = germanDateFormatter.date(from: dateFromTextField.text ?? "")!
let enddate = germanDateFormatter.date(from: dateToTextField.text ?? "")!

filters.append("savedAt BETWEEN datetime('\(sqlDateFormatter.string(from: startdate))') AND datetime('\(sqlDateFormatter.string(from: enddate))')")
}
if companyFilterTextField.text?.count ?? 0 > 0 {
filters.append("fromCompany LIKE '\(companyFilterTextField.text ?? "")'")
}
if contactPersonFilterTextField.text?.count ?? 0 > 0 {
filters.append("contactPoint LIKE '\(contactPersonFilterTextField.text ?? "")'")
}
if visitedFilterSegmentedControl.selectedSegmentIndex == 1 {
filters.append("visitedCompany = 'company1'")
}
else if visitedFilterSegmentedControl.selectedSegmentIndex == 2{
filters.append("visitedCompany = 'company2'")
}
let filterString = filters.joined(separator: " AND ")

然后以类似的方式在我的SQL语句中附加该字符串:
public func getData(limit: Int) -> [Visitor]{
var visitors = [Visitor]()
do{
for row in try db.prepare("SELECT * FROM visitors WHERE \(filterString) LIMIT \(limit) ORDER BY id DESC") {
let visitor: Visitor = Visitor(
id: row[id],
firstName: row[firstName],
lastName: row[lastName],
visitedCompany: row[visitedCompany],
savedAt: row[date],
fromCompany: row[fromCompany],
contactPoint: row[contactPoint])

visitors.append(visitor)
}
}
catch {
print("Could not get row: \(error)")
}
return visitors
}

但是上述示例不起作用(我认为编译器无法以某种方式键入检查该语句?/ Xcode冻结...)。

但是我还是 而不是不想使用原始SQL方法,而是想使用SQLite.swift提供的类型安全的API,这样我的(不完整的)样本基本上看起来像这样:
public func getData(limit: Int) -> [Visitor]{
var visitors = [Visitor]()
do{
for row in try db.prepare(visitorsTable.filter(/*what in here?*/).limit(limit, offset: 0).order(id.desc)) {
let visitor: Visitor = Visitor(
id: row[id],
firstName: row[firstName],
lastName: row[lastName],
visitedCompany: row[visitedCompany],
savedAt: row[date],
fromCompany: row[fromCompany],
contactPoint: row[contactPoint])

visitors.append(visitor)
}
}
catch {
print("Could not get row: \(error)")
}
return visitors
}

显然,我已经为样本定义了所有必需的变量。

最佳答案

我只想分享我的解决方案,该解决方案显然无法回答问题,因为我无法使用类型安全的API。
我改为执行原始SQL查询,然后将所有列转换为它们对应的数据类型:

public func getDataNew(limit: Int, offset: Int, filter: String) -> [Visitor]{
var visitors = [Visitor]()
do{
let statement: Statement = try db.run("SELECT * FROM visitors WHERE \(filter) ORDER BY id DESC LIMIT \(limit) OFFSET \(offset)")
for row in statement {
print(row[0] as! Int64)
let visitor: Visitor = Visitor(id: Int(row[0] as! Int64),
firstName: row[1] as! String,
lastName: row[2] as! String,
profileImage: Data.fromDatatypeValue(row[3] as! Blob),
visitedCompany: row[4] as! String,
savedAt: Date.fromDatatypeValue(row[5] as! String),
fromCompany: row[6] as! String,
contactPoint: row[9] as! String)
visitors.append(visitor)
}
}
catch {
print("Could not get row: \(error)")
}
return visitors
}
我希望这对尝试从数据库中检索BLOB或DATETIME对象的人有所帮助。

关于ios - 如何使用SQLite.swift类型安全API链接条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62394785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com