我处于这样的情况:我已经全局声明了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];
}
从表现和其他角度来看,哪种方式最好?
答案 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)如果每次都关闭数据库,那么每次都会打开数据库,所以不需要任何条件。