API sqlite имеет концепцию, которая логически эквивалентна .net reader.Это означает, что вы выполняете запрос, а затем повторяете считанные данные по мере необходимости.Это сохраняет память на низком уровне, так как вы не извлекаете полный набор результатов в память.
Прежде всего, взгляните на другие обертки, такие как fmdb.
здесь эквивалентно использование c api внутри iPhone,Вы подготавливаете оператор, передавая запрос sql (sqlite анализирует под обложкой), затем вызываете step, который эквивалентен методу чтения .net reader.Вы читаете столбцы так же, как читатель данных .net.Обратите внимание, что этот пример готовит и завершает (очищает).Более эффективный подход состоит в том, чтобы сохранить подготовленный оператор и затем вызвать сброс, чтобы избежать использования sqlite для многократного анализа запроса.
// prep statement
sqlite3_stmt *statement;
NSString *querySQL = @"SELECT id, name FROM contacts";
NSLog(@"query: %@", querySQL);
const char *query_stmt = [querySQL UTF8String];
// preparing a query compiles the query so it can be re-used.
sqlite3_prepare_v2(_contactDb, query_stmt, -1, &statement, NULL);
// process result
while (sqlite3_step(statement) == SQLITE_ROW)
{
int idx = 0;
Contact *contact = [[Contact alloc] init];
NSNumber *idField = [NSNumber numberWithLongLong:sqlite3_column_int64(statement, idx++)];
[contact setId:idField];
NSString *nameField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, idx)];
[contact setName:nameField];
NSLog(@"id: %@", [contact id]);
NSLog(@"name: %@", [contact name]);
[nameField release];
[contactsList addObject:contact];
[contact release];
}
sqlite3_finalize(statement);