【问题标题】:Works fine for the first time, next time getting DB locked issue第一次工作正常,下次遇到数据库锁定问题
【发布时间】:2012-02-27 18:31:16
【问题描述】:

请找到下面的函数。它第一次运行良好。

我的意思是,当我第一次添加文本时,它可以工作,然后当我尝试再次添加新文本时,它给我的感觉就像“数据库已锁定”。

我不确定第一次的效果如何?

请告诉我我的代码有什么问题。

//==================================================================
- ( 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;

}

【问题讨论】:

标签: iphone sqlite ios4


【解决方案1】:

我不会深入您的代码,但请确保 -

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

你没有在任何地方使用reset语句..尝试使用reset语句..

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 2012-06-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2017-04-14
    • 2015-12-25
    相关资源
    最近更新 更多