2016-12-19 4 views
0

Я использую 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), вероятно, довольно мало.

ответ

0

Эта структура пытается максимально отвлечь такие детали.

Единственный способ сохранить подготовленный оператор вокруг - с помощью функций до execute raw SQL.

И, в SQLite, накладные расходы на подготовку обычно довольно малы; наиболее типичная проблема производительности связана с не объединением нескольких операторов в одну транзакцию.

0

Возможно, я могу переусердствовать, время компиляции SQLite на этом Table.filter (uuidKeyLite == thisKey), вероятно, довольно мало.

думаю есть. Тем более, что с SQLite.swift время компиляции оператора в настоящее время незначительно по сравнению с его внутренними механизмами. См. Comparing the Performances of Swift SQLite libraries