我将sqlite用于我的持久商店。我使用基于内存商店的主键的字典: var localContext = [String: GrandLite]()
。
我使用下面的功能从字典或数据库中检索对象,然后存储在字典中。此功能经常被调用,我正在尝试优化它。
class func retrieveByKey<T: GrandLite>(aType: [T], thisKey: String) -> T? {
let thisStack = FoodysLiteStack.thisDataStack
if let thisObject = thisStack.localContext[thisKey] as? T {
return thisObject
} else {
do {
let db = thisStack.localDatabase
let thisTable = T.getTable()
if let thisRow = try db.pluck(thisTable.filter(uuidKeyLite == thisKey)) {
let thisObject = T(withRow: thisRow)
thisStack.localContext[thisKey] = thisObject
return thisObject
} else {
return nil
}
} catch {
NSLog("WARNING: Unhandled error for T retrieveByKey")
return nil
}
}
}
我了解sqlite.swift拔出基本上是限制1的准备。此外,准备编译SQL语句,绑定变量并执行它。我试图避免每次调用此功能时避免使用SQLITE编译时间。
在sqlite.swift框架中,是否可以提前准备语句,然后在执行之前绑定变量?您可以使用db.prepare和db.run进行插入和更新,但是我看不到一种可以绑定已准备好的选择语句的变量的方法。我可能对此有所思考, thisTable.filter(uuidKeyLite == thisKey)
上的sqlite编译时间可能很小。
该框架尽力将这些细节抽象出来。
保留准备好的语句的唯一方法是使用函数执行RAW SQL。
是的,在sqlite中,准备头顶通常很小;最典型的性能问题来自不将多个语句合并为单个交易。
我可能对此有所思考,thistable.filter(uuidkeylite == thiskey)上的sqlite编译时间可能很小。
我想你愿意。尤其是使用sqlite.swift,与内部机制相比,该声明汇编时间目前可以忽略不计。请参阅比较Swift Sqlite库的性能