2009-04-05 2 views
0

필자는 데이터베이스에 문제가 있습니다 - 여하튼 어느 시점에서 데이터베이스가 열리기 전에 데이터베이스가 닫혀있는 것처럼 보입니다.개체가 데이터베이스에서 초기화되었는지 알 수있는 올바른 방법은 무엇입니까?

데이터베이스가 열리지 않은 경우 다음 문을 사용하고 있습니다. if (! database) then break;

* 데이터베이스가 열려 있지 않을 때 * 데이터베이스가 nil (database = nil)로 설정되는 경우.

내가 올바른 방법으로하고 있습니까? 아니면 내 코드에 다른 오류가 있습니까?

여기 내 코드입니다 :

-(BOOL) loadDB: (NSString*) dbPath { 

//Database was opened before 
if (database) { 
    sqlite3_close(database); 
    database = nil; 
} 

//Opening database 
if (sqlite3_open([dbPath UTF8String], &database) != SQLITE_OK) 
{ 
    database = nil; 
    return FALSE; 
} 

return TRUE; 

}

코드가 여러 번 호출되는 일부 시간에이 예외가 발생합니다. 왜 이것이 일어날 수 있습니까?

디버거를 사용하여 문제가 발생한 위치를 확인할 때 다음이 표시됩니다. sqlite3_close (database);

미리 감사드립니다.

+0

은이 개체의 첫 번째 인스턴스 생성시 데이터베이스가 nil로 설정되어 있습니까? 우리는 코드 스 니펫을 가지고 있기 때문에 데이터베이스가 얼마나 많은 다른 장소에 접근 할 수 있는지 알려주지는 않습니다. – KevinDTimm

답변

1

대신 전무의 NULL로 데이터베이스 포인터를 설정하십시오. 오브젝티브 C 전무에서

-(BOOL) loadDB: (NSString*) dbPath { 
    BOOL retVal = TRUE 

    //Database was opened before 
    if (database) { 
     sqlite3_close(database); 
     database = NULL; // <-- NULL not nil 
    } 

    //Opening database 
    if (sqlite3_open([dbPath UTF8String], &database) != SQLITE_OK) { 
     database = NULL; // <-- NULL not nil 
     retVal = FALSE; 
    } 
    return retVal; 
} 

이 전무 포인터 그러나 database은 개체에 대한 포인터입니다. 구조체이므로 NULL을 대신 사용하십시오.

+0

너무 나쁘다 그는 대답을 알지도 못한다. (또는 해결했고 해결하지 않았다.) – KevinDTimm

+0

그는 내 복제본에 대한 답변을 수락했습니다. http://stackoverflow.com/questions/720603/sqlite3close-throws-an-exception/720739#720739 – Abizern

1

귀하의 가까운 중괄호 (하지만, 스타일 참고로

.이 컴파일되지 않기 때문에 그게 문제라고 생각하지 않습니다 만에 함수에서 한 시간을 반환 (그 해주세요 너무 이르다 맨 아래).하는 BOOL 만들기 TRUE로 초기화하고 필요한 경우 FALSE로 값의 변경합니다.

+0

여러 번의 반품은 특정 조건에서 유용하기 때문에 원칙적으로 개인 반품으로 생각하지 않습니다. – Abizern

+0

여러 번의 반품은 기능이 너무 큰 것을 의미합니다. 여러 번 반품하는 것은 단순한 냄새가 아니라 유지 관리의 악취입니다. – KevinDTimm

+0

귀하의 권장 사항에 따라 코드를 재 설계했지만 도움이되지 않았습니다. –

관련 문제