Reputation: 12617
I don't fully understand sqlite3_finalize. My initialy code.
while (j < Autors.count)
{
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK)
{
sqlite3_bind_int(compiledStatement, 1, ((AuthorSettings *)[Autors objectAtIndex:j]).authorId);
if(sqlite3_step(compiledStatement) != SQLITE_DONE)
{
NSLog(@"sqlite3_step error %s", sqlite3_errmsg(database));
sqlite3_busy_timeout(database, 5);
}
else
{
if(sqlite3_prepare_v2(database, sqlStatement_1, -1, &compiledStatement, NULL) == SQLITE_OK)
{
sqlite3_bind_int(compiledStatement, 1, bookId);
if(sqlite3_step(compiledStatement) != SQLITE_DONE)
{
NSLog(@"sqlite3_step error %s", sqlite3_errmsg(database));
sqlite3_busy_timeout(database, 5);
}
else j++;
}
else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));
}
}
}
sqlite3_finalize(compiledStatement);
I added sqlite3_finalize functions. Please check me.
while (j < Autors.count)
{
sqlite3_finalize(compiledStatement); //**added
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK)
{
sqlite3_bind_int(compiledStatement, 1, ((AuthorSettings *)[Autors objectAtIndex:j]).authorId);
if(sqlite3_step(compiledStatement) != SQLITE_DONE)
{
NSLog(@"sqlite3_step error %s", sqlite3_errmsg(database));
sqlite3_busy_timeout(database, 5);
}
else
{
sqlite3_finalize(compiledStatement); //**added
if(sqlite3_prepare_v2(database, sqlStatement_1, -1, &compiledStatement, NULL) == SQLITE_OK)
{
sqlite3_bind_int(compiledStatement, 1, bookId);
if(sqlite3_step(compiledStatement) != SQLITE_DONE)
{
NSLog(@"sqlite3_step error %s", sqlite3_errmsg(database));
sqlite3_busy_timeout(database, 5);
}
else j++;
}
else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));
}
}
}
sqlite3_finalize(compiledStatement);
Upvotes: 4
Views: 8981
Reputation: 52575
sqlite3_finalize
is the opposite of sqlite3_prepare_v2
. So your code should look something like this:
sqlite3_prepare_v2(...);
while () {
sqlite3_reset(...);
sqlite3_bind_int(...);
sqlite3_step(...);
}
sqlite3_finalize(...);
You don't want to prepare you statements more than necessary.
Upvotes: 11