SQLite - 打开数据库的最佳实践

时间:2016-06-09 12:53:23

标签: ios objective-c sqlite

我处于这样的情况:我已经全局声明了sqlite3变量来存储数据库连接并且每次都打开数据库而不关闭它。这导致我的应用程序内存泄漏。我可以通过在打开它之前关闭数据库来解决这个问题。

sqlite3 *dbObj;

-(BOOL)openDB
{
     //opening database 
     if (sqlite3_open(dbpath, &dbObj) == SQLITE_OK)
     {
         NSLog(@"Database opened successfully .....");
         return YES;
     }
     else
     {
         return NO;
     }
}


-(NSArray)getAllTablesInDatabse:(NSString*)database
{
    sqlite3_close(dbObj);
    [self openDB];
} 

这是我修复它的第一种方式。

我能够做同样的另一种方法,检查dbObj在openDB函数中是否为nil / NULL,而不是每次都关闭和打开。第二种方式:

-(BOOL)openDB
{
      if(dbObj == nil || dbObj == NULL || dbObj = 0)
      {
            //opening database 
           if (sqlite3_open(dbpath, &dbObj) == SQLITE_OK)
           {
                NSLog(@"Database opened successfully .....");
                return YES;
           }
           else
           {
                return NO;
           }
      }
      else
      {
           return YES;
      }  
}

-(NSArray)getAllTablesInDatabse:(NSString*)database
{
    [self openDB];
}

从表现和其他角度来看,哪种方式最好?

1 个答案:

答案 0 :(得分:0)

1)完成所需任务后关闭数据库是一个好习惯。例如,您正在创建一个表,然后执行,

  NSString *docsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

self.databasePath = [[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"contacts.db"]];

sqlite3_stmt *statement;



if (sqlite3_open([self.databasePath UTF8String], &_contactDB) == SQLITE_OK) {


    NSLog(@"database opened successfully");

    NSString *query = @"create table if not exists Employee (id integer primary key, name text, surname text, roll text, salary integer)";

        const char *queryStatement2 = [query UTF8String];

        char *errorMessage;


    if (sqlite3_exec(self.contactDB, queryStatement2, NULL, NULL, &errorMessage) == SQLITE_OK) {

        if (!errorMessage) {
             NSLog(@"table created sucessfully!");
        }
        else{

            NSLog(@"error : %s",errorMessage);

        }

    }


}
sqlite3_close(self.contactDB);

因此,您应该在每次使用后关闭数据库。

2)在打开数据库之前检查一下,如果它是打开的,或者每次打开之前都与关闭数据库进行比较。

3)如果每次都关闭数据库,那么每次都会打开数据库,所以不需要任何条件。