希望我能正确理解您的问题。
如果图片不是很大,那么只使用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,如果这是多余的信息,很抱歉,但上面将搜索你的 imageDatabase 以查找包含 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 方法,则字符串搜索在磁盘上以串行方式完成,并且内存命中较少。
找到特定项目后,您可以对特定字符串进行正则表达式搜索和替换,从而减少代码的内存占用。