Меня тоже укусила эта;мне потребовалось целое утро, чтобы пройтись по базе данных FMD и прочитать документацию по API sqlite3, чтобы найти ее.Я до сих пор не до конца уверен в основной причине проблемы, но в соответствии с этой ошибкой в PHP необходимо вызвать sqlite3_exec вместо подготовки оператора с помощью sqlite3_prepare_v2 и затем вызватьsqlite3_step.
Документация, по-видимому, не предполагает, что такое поведение может произойти, отсюда и наша путаница, и я бы хотел, чтобы кто-то с большим опытом работы с sqlite выдвинул некоторые гипотезы.
Я решил эту проблему, разработав метод для выполнения пакета запросов.Пожалуйста, найдите код ниже.Если вы предпочитаете, вы можете переписать это в категорию, а не просто добавить его в FMDatabase.h, ваш вызов.
Добавьте это в интерфейс FMDatabase в FMDatabase.h:
- (BOOL)executeBatch:(NSString*)sql error:(NSError**)error;
Добавьте это к реализации FMDatabase в FMDatabase.m:
- (BOOL)executeBatch:(NSString *)sql error:(NSError**)error
{
char* errorOutput;
int responseCode = sqlite3_exec(db, [sql UTF8String], NULL, NULL, &errorOutput);
if (errorOutput != nil)
{
*error = [NSError errorWithDomain:[NSString stringWithUTF8String:errorOutput]
code:responseCode
userInfo:nil];
return false;
}
return true;
}
Обратите внимание, что в executeBatch отсутствуют многие функции, которые делают его непригодным для многих целей.В частности, он не проверяет, заблокирована ли база данных, не проверяет, не заблокирована ли сама база данных FMD, он не поддерживает кэширование операторов.
Если вам это нужно, приведенное вышехорошая отправная точка, чтобы кодировать это самостоятельно.Удачного взлома!