dimanche 22 mars 2015

Sqlite: Database is locked in iOS with update query

I know this question has been asked many times on SO, but still I am facing the same problem. I am using sqlite in my iOS app for storing data. Every thing is working fine, but when I run update query after insert/select app met with a crash and shows sqlite error "Database is locked". When I run app again and call update query (this time before select/insert query), data updates successfully. Can anyone tell me where I am doing wrong ?


Insert Query



-(BOOL)insertRecord:(NSArray*)array{
BOOL success=NO;
NSLog(@"%@",array);
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:[self getDBpath]] )
{
NSLog(@"No db file");
}
else if(sqlite3_open([[self getDBpath] UTF8String],&database) == SQLITE_OK)
{
for (int i=0; i<[array count]; i++) {
NSString *querySQL = [NSString stringWithFormat:@"INSERT INTO Record (playerID, playerName, score,keyword1,keyword2,keyword3) VALUES (%d,\"%@\", %d,%d,%d,%d)",[[[array objectAtIndex:i]valueForKey:@"Number"] intValue],[[array objectAtIndex:i] valueForKey:@"Name"],[[[array objectAtIndex:i]valueForKey:@"Score"] intValue],[[[array objectAtIndex:i]valueForKey:@"Keyword1"] intValue],[[[array objectAtIndex:i]valueForKey:@"Keyword2"] intValue],[[[array objectAtIndex:i]valueForKey:@"Keyword3"] intValue]];
char *errmsg=nil;

if(sqlite3_exec(database, [querySQL UTF8String], NULL, NULL, &errmsg)==SQLITE_OK)
{
NSLog(@".. Row Added ..");
success=YES;
}
}
sqlite3_close(database);

}
return success;
}


Select query



- (NSDictionary*) getPlayerRecord:(NSString*)playerID
{
const char *dbpath = [[self getDBpath] UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat: @"select playerName,score,keyword1,keyword2,keyword3 from Record where playerID=%ld",[playerID integerValue]];
const char *query_stmt = [querySQL UTF8String];
NSMutableDictionary *resultDict=[NSMutableDictionary new];
if (sqlite3_prepare_v2(database,
query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
if (sqlite3_step(statement) == SQLITE_ROW)
{
[resultDict setValue:playerID forKey:@"Number"]; //starts with zero


NSString *name = [[NSString alloc] initWithUTF8String:
(const char *) sqlite3_column_text(statement, 0)];
[resultDict setValue:name forKey:@"Name"];
NSInteger score = sqlite3_column_int(statement, 1);
[resultDict setValue:[NSString stringWithFormat:@"%ld",score] forKey:@"Score"];
NSInteger keyword1 = sqlite3_column_int(statement, 2);
[resultDict setValue:[NSString stringWithFormat:@"%ld",keyword1] forKey:@"Keyword1"];
NSInteger keyword2 = sqlite3_column_int(statement, 3);
[resultDict setValue:[NSString stringWithFormat:@"%ld",keyword2] forKey:@"Keyword2"];
NSInteger keyword3 = sqlite3_column_int(statement, 4);
[resultDict setValue:[NSString stringWithFormat:@"%ld",keyword3] forKey:@"Keyword3"];
NSLog(@"%@",resultDict);
return resultDict;
}
else{
NSLog(@"Not found");
return nil;
}
}
sqlite3_reset(statement);
sqlite3_close(database);

}

return nil;
}


Update Query



-(BOOL)updateRecordForID:(NSString*)ID Keyword1:(NSString*)key1 Keyword2:(NSString*)key2 Keyword3:(NSString*)key3 andScore:(NSString*)score
{
//BOOL sucsuss=NO;
if (sqlite3_open([[self getDBpath] UTF8String], &database) == SQLITE_OK) {

NSString *updateQuery = [NSString stringWithFormat:
@"UPDATE Record SET score = %d, keyword1=%d,keyword2=%d, keyword3=%d WHERE playerID =%d",[score intValue],[key1 intValue],[key2 intValue],[key3 intValue],[ID intValue]];
const char *sql = [updateQuery UTF8String];
sqlite3_stmt *statement;
int result = sqlite3_prepare_v2(database, sql, -1, &statement, NULL);
if (result == SQLITE_OK) {
if (r==SQLITE_ERROR){
if(SQLITE_DONE != sqlite3_step(statement))
NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(database));
sqlite3_reset(statement);
}
}
sqlite3_finalize(statement);
sqlite3_close(database);
return YES;
}


Calling


//working



BOOL m=[[MultiDBManager getSharedInstance] updateRecordForID:@"0" Keyword1:@"1" Keyword2:@"1" Keyword3:@"" andScore:@"458"];

NSDictionary *dict1=[[MultiDBManager getSharedInstance] getPlayerRecord:@"0"];


//getting database is locked error if I call select/insert query before update



NSDictionary *dict1=[[MultiDBManager getSharedInstance] getPlayerRecord:@"0"];
BOOL m=[[MultiDBManager getSharedInstance] updateRecordForID:@"0" Keyword1:@"1" Keyword2:@"1" Keyword3:@"" andScore:@"458"]; //crash with an error database is locked.


Can any one please help me.


Thanks in advance.


Aucun commentaire:

Enregistrer un commentaire