Массовая вставка SQLite на iPhone не работает - PullRequest
0 голосов
/ 29 января 2010

Я боролся с этой, казалось бы, легкой проблемой в течение 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);  
}  
}  

Ответы [ 3 ]

3 голосов
/ 06 мая 2010

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

sqlite3_open([dbPath UTF8String], &database);

Просто думал, что я опубликую (что, кажется, ответ) для других

1 голос
/ 01 февраля 2012

Мне кажется, я только что решил ту же проблему. Решение состоит в том, чтобы позвонить:

sqlite3_reset(insert_statement); 

между вашими итерациями вставки (в конце каждой итерации) в вашем цикле for.

1 голос
/ 29 января 2010

Одна вещь, которую я заметил в вашем коде, это то, что вы запрашиваете параметр # 4, связанный с int, в то время как вы запрашиваете у объекта doubleValue.

Кроме того, вы уверены, что входные объекты в порядке? Возможно, вы захотите добавить некоторые утверждения, чтобы убедиться, что ни одно из его полей не равно nil.

...