Надеюсь, я правильно понимаю ваш вопрос.
Если изображения не очень большие, то, вероятно, можно просто использовать ключевое слово like, как в:
sqlite3_stmt *statement = nil;
if(statement == nil)
{
const char *sql = [[NSString stringWithFormat:@"SELECT imageContent FROM imageDatabase WHERE imageContent LIKE '%@%@%@'", @"%", imageValue, @"%"] UTF8String];
if (sqlite3_prepare_v2(db, sql, -1, &statement, NULL) != SQLITE_OK) {
//NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(db));
return;
}
}
while (sqlite3_step(statement) == SQLITE_ROW) {
// query was successful
// perform some action on the resulting data
}
sqlite3_finalize(statement);
statement = nil;
Если вы установите imageValue = image1, image2 или что-то еще, это даст вам искомый элемент из базы данных без необходимости манипулирования строками в коде. Я предполагаю, что вы знаете SQL, так что извините, если это избыточная информация, но выше будет искать в вашей базе данных imageD чем-нибудь, что содержит image1, image2 imageValue. Найдя строку, вы можете обновить ее или использовать предложение WHERE с оператором UPDATE SQL, но я считаю, что это немного опасно из-за возможности непреднамеренного обновления нескольких строк без предварительной проверки содержимого, чтобы убедиться, что это то, что вы хотите.
Кроме того, если вы делаете обновления базы данных с этим, вы найдете значительное повышение производительности, обернув вставки и обновления транзакциями, такими как:
const char *sql = "BEGIN TRANSACTION;";
char *errMsg;
sqlite3_exec(db, sql, nil, 0, &errMsg);
const char *commit = "COMMIT;";
sqlite3_exec(db, commit, nil, 0, &errMsg);
Он готовит и оптимизирует ваш запрос перед его выполнением. Я видел, что запросы на вставку и обновление выполняются в два раза быстрее с транзакциями.
Если база данных очень большая, это приведет к значительному снижению производительности, но выполнение манипуляции со строками в памяти потребует значительных затрат памяти. Если вы используете метод SQLite LIKE, поиск строк выполняется на диске последовательным способом и имеет меньше попаданий в память.
Как только вы нашли конкретный элемент, вы можете выполнять поиск по регулярному выражению и заменять только эту строку, сохраняя при этом объем памяти вашего кода.