2009-06-27 4 views
3

Что делает заявление «вставить» в SQLite-возвращение в случае успеха?«Вставляет» в SQLite возвращает SQLITE_OK или SQLITE_DONE?

Я всегда считал, что она должна быть SQLITE_DONE, но в последнее время в моих журналах я узнал следующую строку:

sqlite3_step error: 'not an error' 

А вот код, который регистрирует указанную строку:

prepareStatement(addTranslationStmt2, "INSERT INTO translations(lang1_wordid, lang2_wordid) VALUES(?, ?)"); 
if (!addTranslationStmt2) return -2; 

sqlite3_bind_int(addTranslationStmt2, 1, word_id); 
sqlite3_bind_int(addTranslationStmt2, 2, translation_id); 

if(sqlite3_step(addTranslationStmt2) != SQLITE_DONE) 
{ 
    NSLog(@"sqlite3_step error: '%s'", sqlite3_errmsg(database)); 
    sqlite3_reset(addTranslationStmt2); 
    return -1; 
} 

sqlite3_reset(addTranslationStmt2); 

Мне интересно, почему это работает в большинстве случаев. Должен ли я изменить SQLITE_DONE в моем коде на SQLITE_OK?

Спасибо.

+1

Когда вы напечатали код ошибки, что вы видите? –

+0

Проверьте http://code.google.com/p/database-adt/ – Macarse

ответ

3

В таких случаях мне нравится смотреть образцы кода. Вот несколько хороших:

http://sqlite.phxsoftware.com/forums/p/76/6659.aspx

В SQLite Result Codes Reference списки SQLITE_OK, как указывает на успешный результат. Это также первый код ошибки, имеющий код ошибки 0, что делает его каноническим результатом (т. Е. Результатом, который я ожидал бы при успешной операции).

Вы должны поместить в свой код контрольную точку или инструкцию печати, чтобы узнать, действительно ли она возвращает нуль, и проверьте свои данные, чтобы убедиться, что вы получаете ожидаемый результат. Если все это проверит, я бы изменил ваше условие, чтобы проверить SQLITE_OK.

Подробности поведения интерфейса sqlite3_step() зависит от того, был ли подготовлен заявление, используя новую «v2» интерфейс sqlite3_prepare_v2() и sqlite3_prepare16_v2() или более старый унаследованный интерфейс sqlite3_prepare() и sqlite3_prepare16().

В унаследованной интерфейсе, возвращаемое значение будет либо SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR, либо SQLITE_MISUSE. С интерфейсом «v2» может быть возвращен любой из других кодов результатов или расширенных результирующих кодов.

1

Переход от конфигурации «Отладка» на «Выпуск» разрешил проблему для меня.