Ugryzł mnie także ten; zajęło mi cały ranek przechodzenie przez FMDatabase i czytanie dokumentacji API sqlite3, aby ją znaleźć. Wciąż nie jestem do końca pewny co do głównej przyczyny problemu, ale zgodnie z this bug in PHP, konieczne jest wywołanie sqlite3_exec zamiast przygotowania instrukcji za pomocą sqlite3_prepare_v2, a następnie wywołanie sqlite3_step.
Ta dokumentacja nie wydaje się sugerować, że takie zachowanie mogłoby się wydarzyć, stąd nasze zamieszanie i chciałbym, aby ktoś z większym doświadczeniem z sqlite przedstawił kilka hipotez.
Rozwiązałem to, opracowując metodę wykonywania partii zapytań. Proszę znaleźć kod poniżej. Jeśli wolisz, możesz przepisać to na kategorię zamiast dodawać ją do FMDatabase.h, swojego połączenia.
Dodaj do tego interfejsu FMDatabase w FMDatabase.h:
- (BOOL)executeBatch:(NSString*)sql error:(NSError**)error;
Dodaj to do realizacji FMDatabase w 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;
}
Należy pamiętać, że istnieje wiele funkcji brakujących od executeBatch które sprawiają, że nie nadaje się do wielu celów. W szczególności nie sprawdza, czy baza danych jest zablokowana, nie upewnia się, że sama biblioteka FMDatabase nie jest zablokowana, nie obsługuje buforowania instrukcji.
Jeśli tego potrzebujesz, powyższe stanowi dobry punkt wyjścia do samodzielnego zakodowania. Szczęśliwy hacking!
Zobacz https://github.com/ccgus/fmdb/issues/59 – luqmaan