2013-05-26 2 views
5

내 앱의 수명주기 동안 일련의 쿼리를 실행합니다.iOS 라이프 사이클에서 SQlite DB를 언제 열고 닫을 수 있습니까?

현재 FMDB (Objective-C wrapper는 Sqlite C API를 사용하고 있습니다.) 모든 쿼리를 열기 전에 닫고 있습니다.

FMDatabase * db = [FMDatabase databaseWithPath:pathToMyDB]; 
[db open] 
FMResultSet * s = [db executeQuery:@"SELECT * FROM myTable"]; 
// Use FMResultSet 
[db close]; 

개폐 트리거 fopen()fclose() 아래로 낮은, 그래서 나는 열려있는 데이터베이스를 유지하여 억지로 승리를 얻을 수 보라.

그러나 임시 객체가 생성되어 메모리 문제가 발생할 수 있다고 생각합니다. Closing the database 임시 개체를 지 웁니다.

  • 언제 데이터베이스 연결을 열어야합니까? (예 : 응용 프로그램이 backgound를 입력 했습니까?)
  • 메모리 부족 상황에서 VACUUM을 실행해야합니까?

답변

1

데이터베이스는 개체를 만들지 않고 유지합니다 (또는 적어도 그렇게해서는 안됩니다). C API는 SQL 쿼리를 사용하는 편리한 방법이지만 일단 실행되면 C API가 릴리스되어야합니다.

이제 쿼리의 돌아 오는 개체의 경우 해당 개체가 FMResultSet으로 복사됩니다. 일단 그들이 풀렸다면 사라졌어.

이모, 데이터베이스 자체가 너무 크지 않은 경우 앱 대행사에서 참조를 유지해야합니다 (앱 수명주기 동안 보장). 당신이 백그라운드에서 응용 프로그램/이력서를 입력하면 데이터베이스를 열고 당신이 배경으로 갈 때/닫기 만 닫으면됩니다.

은 AppDelegate에이 싱글은 (내가 생각하는) 있음을 유의하십시오 당신은 실제 쿼리를 수행하기 위해 앱에서 어디서든 (AppDelegate*)[[UIApplication sharedApplication]delegate].your_db를 사용하여 데이터베이스에 액세스 할 수 있습니다.

메모리 경고가 발생할 때 VACUUM을 사용하면 앱을 호출 할 때 응용 프로그램이 중단됩니다. 이것에 대해 생각하십시오 : 이미 메모리 경고 ... poof ... crash가있는 경우 데이터베이스를 메모리 (또는 적어도 그 일부)에로드해야합니다.

데이터베이스가 개체를 메모리에 유지하는지 테스트 할 수 있습니다. 1 초 간격 (또는 버튼 누름)으로 100 개의 쿼리를 수행하고 메모리가 커지면 악기를 감시하십시오. 앱 (또는 래퍼 자체)에 누수가있을 수 있으며 데이터베이스에서이를 비난합니다.

+0

답변 해 주셔서 감사합니다. 데이터베이스가 어떤 객체를 생성 및/또는 보관하지 않는다는 것을 100 % 확신합니까? 당신은 아마 맞을 것이지만,이 문서는 다음과 같이 말합니다 : "sqlite3 객체가 성공적으로 소멸되고 관련된 모든 자원이 할당 해제되면 SQLite_OK를 반환 **"http://www.sqlite.org/c3ref/close.html – Robert

+0

나는 생각한다. 관련 리소스는 연결 자체 및 액세스해야하는 몇 가지 사항을 참조합니다. 내가 말했듯이, 나는 잘 모르겠다. 서버 데이터베이스가 이것을한다. 그렇다면 다시 열 필요가 없습니다. 내가 말했듯이, 그것을 테스트하십시오 : 별도의 클래스 오픈 데이터베이스에서 우스운 양의 쿼리 (메모리를 보면서)를 수행 한 다음 닫습니다. 무슨 일이 일어나는지 분명해야합니다. 어떤 객체를 유지하면, 앱이 충돌 할 때까지 메모리가 계속 증가하는 것을 볼 수 있습니다. 모든 것이 상수 메모리 할당을 유지해야하는 경우가 아닙니다. 그것이 가장 쉬운 방법입니다. – skytz

관련 문제