sqlite3_step код возврата 21 во время loadView - PullRequest
0 голосов
/ 16 октября 2010

Экспериментируя с sqlite, я хочу начать просмотр списка с данными из БД.Мой источник выглядит так:

-(void) initTheList {
sqlite3 *db;
int rows = 0;

const char* dbFilePathUTF8 = [searchTermDBLocation UTF8String];
int dbrc = sqlite3_open( dbFilePathUTF8, &db );

// count
if (dbrc) {
    NSLog( @"Could not open the DB" );
} else {
    NSString *queryStatementNS = @"select count(*) from article";
    const char* queryStatement = [queryStatementNS UTF8String];

    sqlite3_stmt *dbps;
    dbrc = sqlite3_prepare_v2(db, queryStatement, -1, &dbps, NULL);

    if (sqlite3_step(dbps) == SQLITE_ROW) {
        rows = sqlite3_column_int(dbps, 0);
    } else {
        NSLog(@"SQL step failed code: %d", sqlite3_step(dbps));
        NSLog(@"Attempted Query: %@", queryStatementNS);
    }

    [queryStatementNS release];
}

if (rows > 1000) { ... } else { ... };
...

На самом деле я подумал, что было бы хорошо вызвать код только один раз после загрузки представления.Поэтому я добавил инициализацию массива и вызов метода:

- (void)loadView {
   [super loadView];
   tableData = [[NSMutableArray alloc] initWithObjects:nil];
   [self initTheList];
}

Однако, при этом sqlite3_step возвращает x15 (SQLITE_MISUSE 21 / * Библиотека использовалась неправильно * /).Если я помещу код для вызова метода в метод numberOfRowsInSection, вызов будет работать нормально.

Может кто-нибудь подсказать, где я могу узнать больше о жизненных циклах и отношении к базе данных sqlite?Меня удивляет, что я могу открыть БД, но чтение не удается, в то время как тот же код, помещенный в метод, который явно вызывается в более поздний момент времени, работает нормально.

1 Ответ

4 голосов
/ 12 ноября 2012

Я сам столкнулся с проблемой кода ошибки 21 («Библиотека использовалась неправильно»). Я не смог найти полезных ответов в Интернете, и я был почти готов заключить, что в библиотеке SQLite3 была какая-то ошибка в XCode. И вот, наконец, я нашел свою проблему: тонкая опечатка в моем SQL.

Ошибка произошла во время оператора INSERT OR REPLACE. Но в этом конкретном заявлении не было опечатки, поэтому я не нашел, где ошибался в течение самого длительного времени. Файл базы данных создавался, поэтому я запустил на нем команду (Unix) strings и обнаружил, что во время создания таблицы я создал опечатку в одном из имен полей. Таблица создана нормально, но с неправильным именем поля. Когда я делал INSERT OR REPLACE, я использовал правильное имя поля. Ах! Несоответствие вызвало ошибку.

Я не знаю, это ваша проблема; но это очень легко сделать опечатку при создании операторов SQL, и их не всегда легко отследить (как я только что продемонстрировал себе сегодня днем). На вашем месте я бы дважды проверил каждое ваше заявление.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...