Я использую SQLite для моего постоянного хранилища. Я использую словарь на основе первичного ключа для хранилища в памяти: var localContext = [String: GrandLite]()
.В инфраструктуре sqlite.swift есть способ подготовить инструкцию раньше времени, а затем привязать переменную непосредственно перед выполнением?
Я использую функцию ниже, чтобы получить объект из словаря или из базы данных, а затем сохранить в словаре. Эта функция часто называется, и я пытаюсь ее оптимизировать.
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, но я не вижу способа привязать переменную для уже подготовленного оператора select. Возможно, я это переусердствую, время компиляции SQLite на thisTable.filter(uuidKeyLite == thisKey)
, вероятно, довольно мало.