我正確地打開和關閉數據庫。但仍然當我嘗試在表中插入記錄時,它給數據庫鎖定錯誤。請建議做什麼。iOS中的Sqlite數據庫鎖定問題
-(void)insertInDatabase:(NSMutableDictionary *) dict
{
NSArray *dbPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [dbPath objectAtIndex:0];
NSString *DBPath=[documentsDirectory stringByAppendingPathComponent:@"InvoiceScannerDB.sqlite"];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate checkAndCreateDatabase: DBPath];
sqlite3 * database;
if(sqlite3_open([DBPath UTF8String], &database) == SQLITE_OK){
// NSLog(@"open");
NSString *sql = [[NSString alloc] initWithFormat:@"select * from Ticket where DELIVERY_SEQ='%@'and DOC_DATE='%@' and ROUTE_CODE='%@'", [dict valueForKey:@"DELIVERY_SEQ"],[dict valueForKey:@"DOC_DATE"],[dict valueForKey:@"ROUTE_CODE"]];
sqlite3_stmt *statement, *statement1, *statement2;
if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, NULL) == SQLITE_OK){
NSLog(@"sqlite3_prepare_v2: %s", sqlite3_errmsg(database));
// NSLog(@"Statement %@",statement);
if(sqlite3_step(statement) == SQLITE_ROW){
NSLog(@"statement: %s", sqlite3_errmsg(database));
// Update Ticket for total scan count
NSLog(@"Same record found in local db");
NSString *sqlUpdate = [[NSString alloc] initWithFormat:@"update Ticket set SCAN_INVOICE = '%ld' where DELIVERY_SEQ='%@'and DOC_DATE='%@' and ROUTE_CODE='%@'", (long)[[dict valueForKey:@"SCAN_INVOICE"] integerValue], [dict valueForKey:@"DELIVERY_SEQ"], [dict valueForKey:@"DOC_DATE"], [dict valueForKey:@"ROUTE_CODE"]];
if(sqlite3_prepare_v2(database, [sqlUpdate UTF8String], -1, &statement2, NULL) == SQLITE_OK){
sqlite3_step(statement2);
// NSLog(@"Scan count updated successfully");
}
else{
NSLog(@"Not updated data");
}
sqlite3_finalize(statement2);
}
else {
// Insert
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setDateFormat:@"dd-MMM-yyyy"];
NSString *newDateString = [dateFormatter stringFromDate:[NSDate date]];
NSString *sqlInsert = [[NSString alloc] initWithFormat:@"insert into Ticket (DELIVERY_SEQ, DOC_DATE, ROUTE_CODE, TOTAL_INVOICE, SCAN_INVOICE, InsertedDate) values('%@','%@', '%@','%ld','%ld', '%@')", [dict valueForKey:@"DELIVERY_SEQ"], [dict valueForKey:@"DOC_DATE"], [dict valueForKey:@"ROUTE_CODE"], (long)[[dict valueForKey:@"TOTAL_INVOICE"] integerValue], (long)[[dict valueForKey:@"SCAN_INVOICE"] integerValue], newDateString];
NSLog(@"Insertion Query %@", sqlInsert);
if(sqlite3_prepare_v2(database, [sqlInsert UTF8String], -1, &statement1, NULL) == SQLITE_OK){
if(sqlite3_step(statement1) == SQLITE_DONE)
{
} else {
NSLog(@"error: %s", sqlite3_errmsg(database));
}
}
else{
NSLog(@"Not inserted data");
}
sqlite3_finalize(statement1);
}
}
else{
NSLog(@"COULD NOT OPEN DB");
}
sqlite3_finalize(statement);
}
sqlite3_close(database);
}
請幫助我在這個問題上
試試這個[link](http://stackoverflow.com/questions/8853954/sqlite-error-database-is-locked)可能是你的希望 – 2015-04-03 05:09:01
在哪一行你必須得到錯誤。 – 2015-04-03 05:41:41
一旦檢查您的方法調用,是在不同的線程或主線程 – 2015-04-03 07:07:53