Как правило, я бы открывал базу данных только один раз и держал ссылку на нее в вашем одноэлементном объекте. От того, насколько это сильно зависит от производительности, зависит то, как часто вы будете делать запросы. Если вы запрашиваете данные для каждой ячейки в tableView, например, я бы ожидал, что открытие базы данных только один раз будет иметь большое значение.
Открыв только один раз, вы также можете сохранить в своем синглтоне ссылки на подготовленные операторы SQL, чтобы вам не приходилось каждый раз их компилировать. Каждый раз, когда вы делаете запрос, сначала проверяйте, подготовлен ли уже составленный отчет. Если нет, вы вызываете sqlite3_prepare_v2, чтобы скомпилировать его и сохранить полученный оператор в своем синглтоне.
if (request_stmt == nil) {
const char *sql = "SELECT ...... WHERE xxx LIKE ?";
sqlite3_prepare_v2(sqldb, sql, -1, &request_stmt, NULL);
}
Вы можете освободить эти операторы, вызвав sqlite3_finalize при освобождении вашего синглтона.