2012-02-27 27 views
0

請找到下面的函數,它第一次正常工作。第一次正常工作,下次遇到數據庫鎖定問題

我的意思是,當我第一次添加一個文本時,然後當我嘗試再次添加一個新文本時,它會給我像「DB已鎖定」。

我不知道它是如何工作的第一次不再?

請讓我知道我的代碼中有什麼問題。

//================================================================== 
- (BOOL) addNewSimpleTemplates:(NSString*)dbPath:(NSString*)title{ 
//================================================================== 

    BOOL returnVal = NO; 

    NSString *maxValuePosition; 

    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    { 
    NSString *selectSQL = [NSString stringWithFormat:@"select MAX(pr.position) FROM phrase_reference pr inner join storyboard_main_categories smc on smc.id = pr.main_category_id where smc.category_name = %@", @"'Simple Templates'"]; 

    const char *sql = [selectSQL UTF8String]; 

    sqlite3_stmt *selectStmt; 

    if(sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) == SQLITE_OK){ 

     while(sqlite3_step(selectStmt) == SQLITE_ROW) 
     {  
     // 
     char *localityChars = (char*)sqlite3_column_text(selectStmt, 0); 
     if (localityChars == NULL) 
      maxValuePosition = nil; 
     else 
      maxValuePosition = [NSString stringWithUTF8String: localityChars]; 

      // increment the postion value 
      int postion = [maxValuePosition intValue] + 1; 

      NSLog(@"%d look here %@ gtitle", postion , title); 

      selectStmt = nil; 

      //saving a new simple phrase is started here 
      sql = "insert into storyboard_phrases(phrase) Values(?)"; 

      if(sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) == SQLITE_OK){ 

       sqlite3_bind_text(selectStmt, 1, [title UTF8String], -1, SQLITE_TRANSIENT); 
      } 

      if(sqlite3_step(selectStmt) != SQLITE_DONE) { 

       NSLog(@"Error: %s just here itself", sqlite3_errmsg(database)); 

      } else { 
       NSLog(@"Insert into row id = %d", sqlite3_last_insert_rowid(database)); 

       /// 

       int phrase_id = sqlite3_last_insert_rowid(database); 

       int sub_category_id = 0; 

       selectStmt = nil; 

       NSString *selectSQL = [NSString stringWithFormat:@"select id from storyboard_main_categories where category_name = %@", @"'Simple Templates'"];  

       sql = [selectSQL UTF8String]; 

       if(sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) == SQLITE_OK) 
       {   
        while(sqlite3_step(selectStmt) == SQLITE_ROW) 
        {     
         char *localityChars = (char*)sqlite3_column_text(selectStmt, 0); 

         NSString* main_category_id = [NSString stringWithUTF8String: localityChars]; 

         sql = "insert into phrase_reference (phrase_id, sub_category_id,main_category_id, position) Values(?,?,?,?)"; 

         if(sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) == SQLITE_OK){ 

          sqlite3_bind_int(selectStmt, 1, phrase_id); 

          sqlite3_bind_int(selectStmt, 2, sub_category_id); 

          sqlite3_bind_int(selectStmt, 3, [main_category_id intValue]); 

          sqlite3_bind_int(selectStmt, 4, postion); 

         } 

         if(sqlite3_step(selectStmt) != SQLITE_DONE) { 
          NSLog(@"Error: %s", sqlite3_errmsg(database)); 
         }else { 
          NSLog(@"Insert into row id = %d", sqlite3_last_insert_rowid(database)); 
          returnVal = YES; 
         } 
        } 
       } 
       sqlite3_finalize(selectStmt); 

       selectStmt = nil; 


       ///// 
      } 
     } 
    } 
    sqlite3_finalize(selectStmt); 

    } 
    NSLog(@"sdsdfsdsd closed"); 
    sqlite3_close(database); 

    return returnVal; 

} 
+0

請查看本[鏈接] [1]。 [1]:http://stackoverflow.com/questions/9323823/sqlite-finalise-and-db-locking-issue/9340115#9340115 – Kartik 2012-02-27 11:29:00

回答

0

我不是你的代碼中要深,但確保 -

Dont forget to finalize the statements before close the database. 
And do reset after every execution of the sqlite3 statement 

您不使用復位聲明的任何地方..嘗試使用復位聲明..

相關問題