2009-03-11 4 views
26

내 iPhone 응용 프로그램에 대한 SQLite 쿼리에 이상한 동작이 발생하기 시작했습니다. "INSERT"문을 실행할 때마다 저널 파일이 내 db 파일 옆에 생성됩니다 (정확한 파일 이름은 "userdata.db-journal"입니다).SQLite에서 저널 파일이 생성되는 이유는 무엇입니까?

문서를 올바르게 이해하면이 저널 파일이 SQLite에서 작업 실패시 롤백 할 수 있도록 사용됩니다. 그러나 작업이 완료되면 파일이 그대로 유지됩니다.

은 'sqlite3_step'함수가 호출되고 후에 저널 파일이 생성
sqlite3 *db = NULL; 
sqlite3_open("userdata.db", &db); 

sqlite3_stmt *insertStmt = NULL; 
const char *query = "INSERT INTO table VALUES(?,?)"; 
sqlite3_prepare_v2(db, query, -1, &insertStmt, NULL); 

sqlite3_bind_int(insertStmt, 1, 0); 
sqlite3_bind_int(insertStmt, 2, 0); 

sqlite3_step(insertStmt); 

sqlite3_reset(insertStmt); 
sqlite3_clear_bindings(insertStmt); 

sqlite3_close(db); 

이 상태로 유지 :

나는 쿼리 (단순에 대한 반환 값 없음 검사)를 준비, 바인딩 및 실행하기위한 고전적인 단계를 수행 내가 DB를 닫을 때까지. 나가기 위해서 무엇을해야합니까?

답변

24

SQLite는 기본적으로 트랜잭션의 시작, 좋은 일입니다. 일반적으로 커밋시 파일을 삭제합니다.

PRAGMA SQL 명령을 통해 파일을 자르거나 (작성/삭제가 필요 없음) 단순히이 동작을 변경하거나 0으로 설정할 수 있습니다. 사용중인 SQLite 버전에서 모든 옵션이 지원되는 것은 아닙니다. 당신은, 잘라 내기, 삭제 또는 저널을 무효화에 의해 구현되는, COMMIT까지

PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF 

쓰기 작업이 정상적으로 완료되지 않습니다.

이 동작이 새로운 경우 SQLite의 업그레이드가 기본 동작을 변경 한 것 외에 변경되었을 수있는 이유에 대한 설명이 없거나 모든 트랜잭션에 대해 업무 일지를 다시 열지 않아도 더 정교 해졌습니다.

2

왜 하시겠습니까?

저널 파일은 각 트랜잭션을 데이터베이스에 기록합니다. 데이터베이스가 닫힐 때까지 충돌이 발생한 후에도 쓰기 버퍼가 플러시되지 않은 경우에도 DB 상태를 재구성 할 수 있습니다.

2

조 (Joe)가 말했듯이, 트랜잭션이 시작될 때 저널이 작성되고 SQLlite는 명령문을 시작할 때 SQLlite를 작성합니다.

은 저널을 삭제하고 문이 DB를 사용하기 위해 최선을 다하고되었는지 확인하려면 다음

sqlite3_finalize(insertStmt); 

친한 전에.

.journal 파일이 사라지고 모든 데이터가 DB에서 안전하고 안전합니다.

희망이 도움이됩니다.

chris.

관련 문제