#objective-c #sqlite
#objective-c #sqlite
Вопрос:
Я пытаюсь использовать datareader в SQLite, но не могу ничего найти в имеющихся у меня документах («Использование SQLite» от Kreibich).
Может кто-нибудь сказать мне, поддерживается ли это и где я могу найти несколько примеров?
Комментарии:
1. Вы имеете в виду datareader . Средство чтения данных NET?
2. Ого… Думаю, у меня сейчас проблемы … да, я думаю, это . NET datareader… есть ли эквивалент в SQLite?
3. Мне трудно следить за вами. SQLite — это утилита для работы с базами данных. Он доступен как DLL или EXE. В нем «нет» datareader. Если я вас правильно понял, вам понадобится библиотека взаимодействия, как предлагает @enverpex.
Ответ №1:
Да, вам просто нужно получить самостоятельно System.Data.SQLite.
Он поставляется в двух вариантах: один со встроенным SQLite, а другой, который требует, чтобы вы также поставляли отдельную встроенную библиотеку DLL sqlite.
Комментарии:
1. Я забыл упомянуть, что это код Objective-C… Я уже знал о System.Data.SQLite … извините, что ввел вас в заблуждение…
2. @Spokane-Чувак: О, у вас теперь большие проблемы, мистер! 😉
Ответ №2:
в sqlite api есть концепция, которая логически эквивалентна .net Reader. это означает, что вы отправляете запрос, а затем повторяете прочитанные данные по мере необходимости. это снижает объем памяти, поскольку вы не загружаете полный набор результатов в память.
прежде всего, взгляните на другие оболочки, такие как fmdb.
вот эквивалент использования c api внутри iPhone. Вы подготавливаете инструкцию, передавая sql-запрос (sqlite выполняет синтаксический анализ под обложкой), затем вызываете step, который эквивалентен методу чтения .net reader. Вы читаете столбцы точно так же, как программа чтения данных .net. Обратите внимание, что этот пример подготавливает и завершает (очищает). Более эффективный подход заключается в сохранении подготовленной инструкции и последующем вызове reset, чтобы 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, amp;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);