title: Database is locked in Sqlite
body: <p>I am developing an iPhone app, when I insert data to the database I got <code>"Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error while inserting data. 'database is locked''" Error.</code>
  The code is : </p>
  
  <pre><code>- (NSString *) getDBPath {        
          NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
          NSString *documentsDir = [paths objectAtIndex:0];
          return [documentsDir stringByAppendingPathComponent:@"Halal.sqlite"];
  }
  
  + (void) finalizeStatements {
  
              if (database) sqlite3_close(database);
              if (deleteStmt) sqlite3_finalize(deleteStmt);
              if (addStmt) sqlite3_finalize(addStmt);
              if (detailStmt) sqlite3_finalize(detailStmt);
              if (updateStmt) sqlite3_finalize(updateStmt);
  }
  
  - (void) gettingData:(NSString *)dbPath {
  
              NSLog(@"Data base path is %@",dbPath);
              if (sqlite3_open([dbPath UTF8String], &amp;database) == SQLITE_OK)
              {
                  const char *sql = "select * from Product";
                  sqlite3_stmt *selectstmt;
                  if(sqlite3_prepare_v2(database, sql, -1, &amp;selectstmt, NULL) == SQLITE_OK) 
                  {
                      while(sqlite3_step(selectstmt) == SQLITE_ROW)
                      {
          [membersInfoDict setValue:[NSString stringWithUTF8String:(char*)sqlite3_column_text(selectstmt, 0)] forKey:@"ProductName"];
                          [membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)] forKey:@"ProductBarcode"];
                          [membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)] forKey:@"ProductImage"];
                          [membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)] forKey:@"ProductIngredients"];
                          [membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)] forKey:@"ProductStatus"];
  
  
                          if(membersInfoDict)
                          {
                             [membersInfoArray addObject:membersInfoDict];
                             membersInfoDict = nil;
                          //  NSLog(@"Entered and return");
                              return;
                          }
                      }
                  }            
              }
  
              else
                  sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.
  
  }
  
  
  - (void) addRecord:(NSMutableDictionary *)recordDict
  {
              if (sqlite3_close(database))
              {
                  NSLog(@"Closed");
                  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
                  NSString *documentsDir = [paths objectAtIndex:0];
  
                  [self gettingData:[documentsDir stringByAppendingPathComponent:@"Halal.sqlite"]];                   
              }   
              else {
                  NSLog(@"Not Closed");
              }               
              if(addStmt == nil) {
                  const char *sql = "insert into Product(ProductName, ProductBarcode , ProductImage,ProductIngredients,ProductStatus ) Values(?,?,?,?,?)";
                  if(sqlite3_prepare_v2(database, sql, -1, &amp;addStmt, NULL) != SQLITE_OK)
                      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
              }
  
              sqlite3_bind_text(addStmt, 1, [[recordDict objectForKey:@"ProductName"] UTF8String], -1, SQLITE_TRANSIENT);
              sqlite3_bind_text(addStmt, 2, [[recordDict objectForKey:@"ProductBarcode"] UTF8String], -1, SQLITE_TRANSIENT);
              sqlite3_bind_text(addStmt, 3, [[recordDict objectForKey:@"ProductImage"] UTF8String], -1, SQLITE_TRANSIENT);
              sqlite3_bind_text(addStmt, 4, [[recordDict objectForKey:@"ProductIngredients"] UTF8String], -1, SQLITE_TRANSIENT);
              sqlite3_bind_text(addStmt, 5, [[recordDict objectForKey:@"ProductStatus"] UTF8String], -1, SQLITE_TRANSIENT);
  
  
              if(SQLITE_DONE != sqlite3_step(addStmt))
                  NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
              else
              //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
                  rowID = sqlite3_last_insert_rowid(database);
              NSLog(@"last inserted rowId = %d",rowID);
  
              //Reset the add statement.
              sqlite3_reset(addStmt);
              //sqlite3_commit_hook();
              //sqlite3_commit_hook(addStmt,[NSString stringWithFormat:@"%d",rowID],database);
  
  }
  </code></pre>
  
  <p>Please give me solution for this.
  Thanks a lot...</p>