Friday, 16 August 2013

sqlite3_last_insert_rowid returns 0 after the first insert

sqlite3_last_insert_rowid returns 0 after the first insert

I'm using the following code to insert a row into a database. For some
reason, sqlite3_last_insert_rowid returns the correct row ID for the first
row inserted, but after that it always returns 0.
Between inserts other DB actions may have occurred, like a deletion of a row.
_scoresDB is an instance var.
Here's my insert code:
-(void)insertScore:(OKScore*)score
{
const char *dbpath = [[self dbPath] UTF8String];
if(sqlite3_open(dbpath, &_scoresDB) == SQLITE_OK) {
// Setup the SQL Statement
if(insertScoreStatement == nil) {
//OKLog(@"Preparing statement for cache score");
const char *insertSQL = "INSERT INTO
OKCACHE(leaderboardID,scoreValue,metadata,displayString,submitted)
VALUES(?,?,?,?,?);";
if(sqlite3_prepare_v2(_scoresDB, insertSQL, -1,
&insertScoreStatement, NULL) != SQLITE_OK) {
OKLog(@"Failed to prepare score insert statement with
message: '%s'", sqlite3_errmsg(_scoresDB));
return;
}
}
// Bind the score values to the statement
sqlite3_bind_int(insertScoreStatement, 1, [score OKLeaderboardID]);
sqlite3_bind_int64(insertScoreStatement, 2, [score scoreValue]);
sqlite3_bind_int(insertScoreStatement, 3, [score metadata]);
if([score displayString]) {
sqlite3_bind_text(insertScoreStatement, 4, [[score
displayString] UTF8String], -1, SQLITE_TRANSIENT);
} else {
sqlite3_bind_null(insertScoreStatement, 4);
}
sqlite3_bind_int(insertScoreStatement, 5, (int)[score submitted]);
//Execute the SQL statement
if(sqlite3_step(insertScoreStatement) == SQLITE_DONE) {
int scoreID = sqlite3_last_insert_rowid(_scoresDB);
[score setOKScoreID:scoreID];
OKLog(@"Cached score : %@",score);
} else {
OKLog(@"Failed to store score in cache wihth error message:
%s",sqlite3_errmsg(_scoresDB));
}
sqlite3_reset(insertScoreStatement);
sqlite3_clear_bindings(insertScoreStatement);
sqlite3_close(_scoresDB);
} else {
OKLog(@"Could not open cache DB insertScore");
}
}

No comments:

Post a Comment