Я боролся с этой, казалось бы, легкой проблемой в течение 48 часов, и я не приблизился к решению. Поэтому я надеялся, что кто-то сможет мне помочь.
Я создаю приложение, которое использует комбинацию локальной (SQLite) базы данных и онлайн-базы данных (PHP / MYSQL). Приложение почти закончено. Проверен на утечки и работает как шарм. Однако самая последняя часть - это часть, с которой я боролся.
При запуске я хочу, чтобы приложение проверяло изменения в онлайн-базе данных, и если таковые имеются. Я хочу, чтобы он загрузил и проанализировал XML-файл, содержащий изменения. Пока все работает нормально. Но когда я пытаюсь массово вставить мои проанализированные данные в базу данных, приложение вылетает, выдавая ошибку NSInternalInconsistency. Из-за возврата базы данных SQLITE_MISUSE. Я много гуглил, но все еще не могу решить свою проблему. Поэтому я помещаю код здесь, надеясь, что кто-то может помочь мне исправить это.
И я знаю, что я должен был использовать основные данные для этого. Но это самая последняя часть, с которой я борюсь, и я очень не хочу менять весь мой код сейчас. Основные данные должны будут прийти в обновлении.
Вот ошибка, которую я получаю:
Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Ошибка при вставке данных. 'библиотечная подпрограмма вызвана вне последовательности' '
Вот мой код:
-(void)UpdateDatabase:(const char *)_query NewValues:(NSMutableArray *)_odb dbn:(NSString *)_dbn dbp:(NSString *)_dbp
{
sqlite3 *database;
NSMutableArray *NewValues = _odb;
int i;
const char *query = _query;
sqlite3_stmt *addStmt;
for (i = 1; i < [NewValues count]; i++)
{
if(sqlite3_prepare_v2(database, query, -1, &addStmt, NULL) == SQLITE_OK)
{
sqlite3_bind_text(addStmt, 1, [[[NewValues objectAtIndex:i] name] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 2, [[[NewValues objectAtIndex:i] city]UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_double(addStmt, 3, [[[NewValues objectAtIndex:i] lat] doubleValue]);
sqlite3_bind_int(addStmt, 4, [[[NewValues objectAtIndex:i] long] doubleValue]);
sqlite3_bind_int(addStmt, 5, [[[NewValues objectAtIndex:i] code] intValue]);
}
if(SQLITE_DONE != sqlite3_step(addStmt)) {
NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
}
//Reset the add statement.
sqlite3_reset(addStmt);
}
}