2015-01-27 6 views
0

Прямо сейчас я Вставка в db на основе счета. Если счетчик больше нуля, чем «SELECT» будет запущен, и мои данные будут показаны, иначе «INSERT». Прямо сейчас мой db пуст, поэтому условие переходит в раздел «INSERT» и в этом я получаю «База данных заблокирована: ERROR». Я просмотрел несколько примеров, и он сказал, что мы должны сделать завершение текущего запроса перед тем, как начать новый. Я тоже сделал это, но все же моя проблема такая же. Отправьте мой код здесь:база данных заблокирована при вводе данных ios

if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) 
    { 
     NSString *querySQL = [NSString stringWithFormat: 
           @"SELECT count(*) FROM tables WHERE table_id='%d'", 
           table_id]; 
     NSLog(@"fetch query is.... %@",querySQL); 
     const char *query_stmt = [querySQL UTF8String]; 
     sqlite3_stmt *countstmt; 
     if(sqlite3_prepare_v2(_contactDB, query_stmt, -1, &countstmt, NULL) == SQLITE_OK) 
     { 

      NSLog(@"FEtch"); 
      sqlite3_step(countstmt); 

      rows = sqlite3_column_int(countstmt, 0); 
      NSLog(@"no of rows is %d",rows); 
     } 
     sqlite3_finalize(statement); 
      } 
    if(rows>0) 
    { 
     NSLog(@"NO of rows is : %d",rows); 
     //if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) 
     // { 

     NSString *querySQQL = [NSString stringWithFormat: 
           @"SELECT * FROM tables WHERE table_id='%d'", 
           table_id]; 
     NSLog(@"fetch query is.... %@",querySQQL); 
     const char *query_stmmt = [querySQQL UTF8String]; 
     if (sqlite3_prepare_v2(_contactDB, 
           query_stmmt, -1, &statement, NULL) == SQLITE_OK) 
     { 
      NSLog(@"yes..."); 

     } 
     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 

      //int i=0; 
      NSLog(@"yesssss..."); 
      // NSInteger count = sqlite3_column_int(statement, 2); 
      //NSLog(@"Rowcount is %d",(long)count); 
      table_data= [[NSString alloc] 
         initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)]; 
      status= [[NSString alloc] 
        initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)]; 
      row_id= [[NSString alloc] 
        initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]; 
      table_idd= [[NSString alloc] 
         initWithUTF8String:(const char *) sqlite3_column_text(statement, 3)]; 
      //searchResults = [NSMutableArray arrayWithObject:namee]; 
      NSString *finalarrayy; 
      //for(loop=1;loop<=z;loop++) 
      //{ 
      finalarrayy=[NSString stringWithFormat:@"%@,%@,%@,%@",row_id,table_data,status,table_idd]; 
      [stringArray addObject:table_data]; 
      NSLog(@"Array....is...%@",stringArray); 

     } 
     [defaults setObject:stringArray forKey:@"stringarray"]; 
     [defaults synchronize]; 
      //} 
     sqlite3_finalize(statement); 
    } 




    else{ 
     NSLog(@"INsert"); 
     //if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) 
     // { 
     for(i=mn; i<=o ; i++) 
     { 
      for(j=1;j<=19;j++) 

      { 
       k=i*j; 
       NSString *val=[NSString stringWithFormat:@"%d %@ %d %@ %d",i,@"x",j,@"=",k]; 
       //tab_data.value=val; 
       [stringArray addObject:val]; 
       NSString *insertSQLL = [NSString stringWithFormat: 
             @"INSERT INTO tables(table_data,status,table_id) VALUES ('%@', '%@', '%d')", 
             val,@"NO",table_id]; 
       NSLog(@"sql stm. is ..%@",insertSQLL); 


       const char *insert_stmtt = [insertSQLL UTF8String]; 
       sqlite3_prepare_v2(_contactDB, insert_stmtt, 
            -1, &statement, NULL); 
       if (sqlite3_step(statement) == SQLITE_DONE) 
       { 
        NSLog(@"yes"); 
       } 
       else 
       { 

        NSLog(@"Error: failed to insert into the database with message '%s'.", sqlite3_errmsg(_contactDB)); 

       } 

      } 
     } 

    // } 

     sqlite3_finalize(statement); 
     sqlite3_close(_contactDB); 

    } 

PLease сообщите мне, что не так с моим кодом. Код запускается в первый раз, как если бы ничто не было в базе данных, тогда значения вставляются в db, но во второй раз, если я хочу вставить что-то новое в db, тогда его ошибка бросания «база данных заблокирована». Фактически я работает тот же код в viewdidload и о действии segmentcontrol. Для viewdidload работает нормально, но в случае segmentcontrol создается ошибка, любая идея относительно этого. Если кто-то может изменить мой код, я буду очень благодарен ему/ей.

+0

Я думаю, что вы не копируете файл базы данных в NSDocumentDirectory – SRI

+0

@TENSRI ... NOP всего perfect..db уже created..but значения не инертизацию в дб – codey

ответ

0

вы должны всегда закрывать базу данных sqlite после ее использования ... поэтому добавьте эту строку sqlite3_close (DB); сразу после sqlite3_finalize (statement);

+0

@ мухаммад Waqas это не обязательно для закройте db каждый раз. Я уверен, что – codey

Смежные вопросы