2013-10-15 2 views
0

언제 실행합니까? sqlite3_step은 언제 사용합니까? sqlite3_execute는 언제 사용합니까? 이 sqlite3_step 것 같아 문서에서IOS SQLite

는 준비된 성명을 발표 한 후

을 사용해야하지만, 내가 왜 더 한 번에 다음을 실행할 것이고, 왜 sqlite3_execute를 사용할 수 있습니까?

+0

sqlite db에서 데이터를 읽으려면 sqlite3_execute – Ilario

+0

을 사용하지 않아도됩니다. 예를 들면 다음과 같습니다. 실행을 완료 한 삽입 및 단계 –

답변

0

SQLite는 벌크 삽입/업데이트를 위해 SQL 문을 다시 컴파일 할 필요가 없다는 것을 전제로합니다.

if (sqlite3_open(dbpath, &_database) == SQLITE_OK){ 
    char *errMsg; 
    const char *sql_stmt = [query UTF8String]; 

    for each insert query{ 
     if (sqlite3_exec(_database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK){ 
      // Each statement is recompiled 
     } 
    } 

    sqlite3_close(_database); 
} 

을하지만 바인딩 준비된 문을 사용하는 경우, 그것은 더 다음과 같습니다 : 나는 다른 값을 삽입 같은 문을 사용하지만 100 개 개의 삽입이있는 경우,이 같은 것을 보일 것이다

for each insert query { 

    sqlite3_bind_text(stmt, 1, firstColumn, -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(stmt, 2, secondColumn, -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(stmt, 3, thirdColumn, -1, SQLITE_TRANSIENT); 

    sqlite3_step(stmt); 

    sqlite3_clear_bindings(stmt); 
    sqlite3_reset(stmt); 

} 
fclose (pFile); 
sqlite3_finalize(stmt); 
sqlite3_close(db); 

이제는 각 문에 대해 exec를 호출하고 매번 쿼리를 컴파일하지 않고 직접 바인딩을 수행 한 다음 sqlite3_step을 호출하여 각 문을 평가합니다. 성능 차이는 매우 중요 할 수 있습니다.

질문에 대답하려면 하나의 격리 된 쿼리가있을 때 sqlite3_execute를 사용하고 대량 쿼리를 수행 할 때 prepared statements, bindings 및 sqlite3_step을 사용하십시오. 나는 당신이 할 수있는 모든 곳에서 준비된 문장과 바인딩을 사용해야한다고 주장하지만 솔직히 말해서 대량 쿼리를하지 않고 모든 쿼리가 단순하고 고립되어 있다면 편리한 sqlite_exec 메소드를 사용해야한다. 에 대한!).

sqlite의 성능에 대한 자세한 내용은 this stackoverflow post을 참조하십시오.

+0

wait ...so가있는 것으로 보았습니다. 어딘가에 sqlite3_prepare_v2를 사용하려면 sqlite3_exec를 사용하는지 여부를 결정합니다. 또한 sqlite3_exec 사용할 때 완료해야합니까? –

+1

아니요, 준비된 명령문을 삭제하기 위해 sqlite3_finalize가 호출됩니다. sqlite3_prepare_v2를 사용하는 경우 finalize를 호출해야합니다. sqlite3_exec를 호출하면 둘 중 하나를 호출 할 필요가 없습니다. sqlite_exec는 sqlite3_prepare_v2(), sqlite3_step() 및 sqlite3_finalize()에 대한 바로 가기입니다. – jnortey