Я не уверен, что правильно истолковал ваше описание, но, как вы его описываете, мне кажется, что ваш «читатель» шаг за шагом просматривает базу данных и каждый раз, когда находит результат, выполняет обратный вызов.к функции обратного вызова?Это правильно?
Если это так, вы можете несколько раз заблокировать вашу БД, и ваш поиск будет медленным.
Правильный способ - извлечь все совпадения в набор результатов в одномодин запрос - как только этот запрос будет завершен, блокировка будет снята, и у вас будет набор результатов из SQL, который содержит только совпадающие строки.
Вы можете позволить SQLite создать набор результатов, подобный этому, используя запрос типа"SELECT * FROM tablename WHERE columnX LIKE '% searchstring%'"
(или аналогичный, в зависимости от ваших критериев поиска)
Это создаст набор результатов со всеми совпадениями в базе данных, а затемснять блокировку базы данных.Затем вы можете пошагово просмотреть результат, создать объекты и поместить их в NSArray, который связан с вашим представлением пользовательского интерфейса.
NSArray retval = [NSMutableArray array];
//Create a query
NSString *query = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ LIKE %@",
tableName, columnName, searchString];
sqlite3_stmt *statement;
//Database locks here
if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil)
== SQLITE_OK) {
//Database should unlock here, the query is finished
while (sqlite3_step(statement) == SQLITE_ROW) {
char *nameChars = (char *) sqlite3_column_text(statement, 0);
NSString *name = [NSString stringWithUTF8String:nameChars];
SomeClass *info = [[SomeClass alloc] initWithName:name];
/* Extract other columns and put in your object */
[retval addObject:info];
[info release];
}
sqlite3_finalize(statement);
} else {
NSLog(@"SQL-statement failed");
}
При этом не должно возникнуть проблем с записью в БД, когда это необходимо.Выполняйте новые запросы к БД только тогда, когда это абсолютно необходимо, например, когда изменились критерии поиска или обновлено содержимое в БД.
Не запускайте повторные запросы к БД, которая не изменилась, или снеизменные критерии поиска.