2015-11-28 4 views
0

Я использую SqliteDatabase в моем проекте. Я вызываю функцию для manuplation данных.Как закрыть базу данных в sqlite в ios?

-(void)updateInspectionMapData2:(NSString *)clientid : (NSString *)inspectionid : (NSString *)status 
{ 
    NSLog(@"EIGHT"); 
    NSLog(@"inside update data"); 

    const char *dbpath = [databasePath UTF8String]; 
    if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
    { 
     NSArray *checkVal = [self getSubClientDataByInspectionId:inspectionid :clientid]; 
     NSLog(@"check is %@",checkVal); 
     if(checkVal == nil || [checkVal count] == 0) 
     { 
      NSString *querySql=[NSString stringWithFormat: 
           @"UPDATE inspectioninspectormap SET status=\"%@\" where inspectionid = \"%@\" and clientid =\"%@\" and (status = \"1\" or status = \"2\")",status,inspectionid,clientid]; 
      NSLog(@"sql is %@",querySql); 
      const char *sql=[querySql UTF8String]; 
      if(sqlite3_prepare_v2(database,sql, -1, &statement, NULL) == SQLITE_OK) 
      { 
       if(SQLITE_DONE != sqlite3_step(statement)) 
       { 
        NSLog(@"Error while updating. '%s'", sqlite3_errmsg(database)); 
       } 
       else 
       { 
        sqlite3_reset(statement); 
        NSLog(@"Update done successfully!"); 
       } 
      } 
      sqlite3_finalize(statement); 
     } 

    } 
    sqlite3_close(database); 

} 

Скажите, пожалуйста, это правильный путь, чтобы закрыть SQLITE database.I не уверен, я прав, потому что позже я получаю ошибку невозможно открыть базу данных.?

ответ

1

С вашим кодом много проблем. Вот то, что я вижу сразу после быстрого обзора:

  1. Вы пытаетесь закрыть базу данных, даже если она не открывается.
  2. Вы пытаетесь завершить подготовку подготовленного заявления, даже если заявление не может быть подготовлено.
  3. Вы не можете позвонить sqlite3_reset в подготовленный отчет.
  4. Вы строите свой запрос, используя stringWithFormat: вместо правильной привязки значений в подготовленный оператор.
  5. Вы используете sqlite3_open вместо sqlite3_open_v2.
  6. Вы не зарегистрировали ошибку, если sqlite3_open или sqlite3_prepare_v2 сбой.
+0

Скажите, пожалуйста, когда использовать ** sqlite3_reset **. У меня нет опыта использования SQLite, так что я просто использовал его. – Techiee

+0

См. [Документация] (http://www.sqlite.org/c3ref/reset.html). Он используется, когда вам нужно снова использовать подготовленное заявление.Вы не используете их повторно, поэтому вам просто нужно его завершить, а не сбросить. – rmaddy

+0

Под каким условием мне нужно повторно использовать инструкцию sqlite для подготовки. Скажите, пожалуйста, – Techiee

1

Существует проблема в вашем коде:

Этот код:

} 
     sqlite3_finalize(statement); 
    } 

} 
sqlite3_close(database); 

должен быть изменен на:

 } 
     sqlite3_finalize(statement); 
    } 
     sqlite3_close(database); 
} 

Закрытие SQLite должно произойти сразу после того, как вы закончите работу с базы данных, а также в открытом соединении, если цикл, но не после открытого соединения !!!!

При использовании sqlite открытие и закрытие должны быть приняты во внимание, иначе это может привести к блокировке базы данных. Проблема возникает, когда вы пытаетесь открыть другое соединение с sqlite без закрытия предыдущего, тогда ваша база данных будет заблокирована. Чтобы этого избежать, вам нужно убедиться, что каждое открытое соединение должно иметь тесное соединение в конце.

Вы можете попробовать FMDB, который представляет собой оболочку sqlite. Используя FMDB, вы можете просто создать SQLite базу данных с помощью:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsPath = [paths objectAtIndex:0]; 
NSString *path = [docsPath stringByAppendingPathComponent:@"database.sqlite"]; 

FMDatabase *database = [FMDatabase databaseWithPath:path]; 

и вы можете открыть подключение к базе данных с помощью:

  [database open]; 

и закрыть его:

  [database close]; 

и для проведения простого заявления:

[database executeUpdate:@"create table user(name text primary key, age int)"]; 

Существует хороший учебник there:

0
+ (NSString*)setupDatabase 
    { 
     NSError *error; 
     NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 

     NSString *dbFilePath = [cachePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", DATABASENAME, DATABASETYPE]]; 

     if (! [[NSFileManager defaultManager] fileExistsAtPath:dbFilePath]) 
     { 
      // if installing the application very first time didn't find db, need to copy 
      NSString *backupDbPath = [[NSBundle mainBundle] pathForResource:DATABASENAME 
                     ofType:DATABASETYPE]; 

      BOOL copiedBackupDb = [[NSFileManager defaultManager] copyItemAtPath:backupDbPath 
                      toPath:dbFilePath 
                      error:&error]; 
      if (! copiedBackupDb) 
      { 
       // copying backup db failed 
       NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
       return nil; 
      } 
     } 
     return dbFilePath; 
    } 

    + (NSString *)getDataBaseFilePath 
    { 
     NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

     NSString *dbFilePath = [cachePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", DATABASENAME, DATABASETYPE]]; 

     return dbFilePath; 
    } 


    +(NSString*)selectItem:(NSString*)itemID 
    { 
     NSString *name=nil; 

     NSString* _dataBasePath = [self getDataBaseFilePath]; 

     sqlite3 *database; 

     if (sqlite3_open([_dataBasePath UTF8String], &database) == SQLITE_OK) { 

      NSString *query; 
      query= [NSString stringWithFormat:@"select ITEM_id from Table where IF ITEM_id='%@' ",itemID]; 
      const char *sql=[query UTF8String]; 
      sqlite3_stmt *selectstmt; 

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

       while (sqlite3_step(selectstmt)==SQLITE_ROW) { 
        if (sqlite3_column_text(selectstmt, 0)) 
         name=[NSString stringWithUTF8String:(char*) sqlite3_column_text(selectstmt, 0)]; 

       } 
       sqlite3_finalize(selectstmt); 
      } 
     } 
     sqlite3_close(database); 

     return (name) ; 

    } 

+(BOOL)updateITEM:(ItemObj*)itemObj; 
{ 

    NSString* _dataBasePath = [self getDataBaseFilePath]; 

    sqlite3 *database; 

    if (sqlite3_open([_dataBasePath UTF8String], &database) == SQLITE_OK) { 

     NSString *qs=[NSString stringWithFormat:@"UPDATE ITEM set User_ID = '%@',User_Name = '%@',Item_id = '%@',User_Status = '%@' WHERE Item_id = '%@'", itemObj.usersid, itemObj.user_name, itemObj.user_id, itemObj.user_status, itemObj.user_id]; 

     const char *sql=[qs UTF8String]; 

     sqlite3_stmt *selectstmt; 

     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) != SQLITE_OK) 
      return FALSE; 
     int result = sqlite3_step(selectstmt); 
     if(result != SQLITE_DONE) return FALSE; 
     sqlite3_finalize(selectstmt); 
    } 
    sqlite3_close(database); 
    return TRUE; 
} 
Смежные вопросы