2013-06-28 2 views
7

SQLite 데이터베이스에 거대한 데이터를 추가해야하고 iOS에서이 기능을 어떻게 수행 할 수 있는지 제안해야합니다. 약 1   GB의 데이터를 서버의 iPhone SQLite 데이터베이스와 동기화해야합니다.SQLite에 거대한 데이터 저장

iOS 측의 데이터베이스에 빠른 데이터를 저장하는 다른 방법이 필요합니다. 데이터를 하나씩 저장하려고했지만 데이터를 동기화하고 저장하는 데 너무 많은 시간이 걸립니다.

+0

SQLTransaction을 사용하여 테이블에 데이터를 삽입하십시오. – Kalpesh

+0

초기 동기화 전용 또는 되풀이 중 하나입니까? –

+3

많은 레코드가 있으면 거래가 도움이 될 수 있습니다. 큰 얼룩이 있다면 SQLite는 적합하지 않습니다. 데이터에 대해 더 자세히 알려주거나 일부 소스 코드를 공유하십시오. BTW, 그 제한 요소는 서버에서 그것을 검색하는 것, 당신의 장치에 저장되지 않을 것입니다. – Rob

답변

4

난 당신이 스택 오버플로 질문을 읽어 제안 : 그것은 일반적으로 SQLite는의 성능을 개선하는 방법에 대해 매우 thourough 모습

How do I improve the performance of SQLite?

의를, 그리고 속도 문제를 타격했을 때 매우 도움이되었다 iOS의 SQLite 데이터베이스에 100,000 개의 레코드를 삽입하려고합니다.

구체적으로 트랜잭션 사용은 전체 삽입 속도를 크게 줄입니다.

const char *dbpath = [[Utilities pathInDocumentsFolder: MY_DATABASE] UTF8String]; 
const char *sql = "INSERT INTO Filters (Region, District, Territory) " \ 
    "VALUES (?, ?, ?)"; 
sqlite3 *mapDB; 
char *sqliteError; 

sqlite3_stmt *insertStatement; 

sqlite3_open(dbpath, &mapDB); 

sqlite3_exec(mapDB, "BEGIN TRANSACTION", NULL, NULL, &sqliteError); 

if (sqlite3_prepare_v2(mapDB, sql, -1, &insertStatement, NULL) == SQLITE_OK) { 
    for (NSArray *row in filtersArray) { 
     sqlite3_bind_text(insertStatement, 1, [[row objectAtIndex: 0] UTF8String], -1, SQLITE_TRANSIENT); // Region 
     sqlite3_bind_text(insertStatement, 2, [[row objectAtIndex: 1] UTF8String], -1, SQLITE_TRANSIENT); // District 
     sqlite3_bind_text(insertStatement, 3, [[row objectAtIndex: 2] UTF8String], -1, SQLITE_TRANSIENT); // Territory 

     if (sqlite3_step(insertStatement) != SQLITE_DONE) { 
      break; 
     } 

     sqlite3_clear_bindings(insertStatement); 
     sqlite3_reset(insertStatement); 
    } 
} 

sqlite3_exec(mapDB, "END TRANSACTION", NULL, NULL, &sqliteError); 

sqlite3_finalize(insertStatement); 

BEGINEND TRANSACTION 제표를 sqlite3_exec 마법이다 : 당신이 무슨 뜻인지 볼 수 있도록 여기에 샘플 코드의 짧은 블록이다.

+0

+1 동의 함. 많은 레코드를 삽입 할 때 트랜잭션을 사용하면 성능이 몇 배 정도 향상됩니다. 다시 바인딩하면 도움이되지만 성능이 향상됩니다. – Rob

+1

다양한'sqlite3' 함수 호출 ('sqlite3_step','SQLITE_DONE' 리턴 코드)의 리턴 코드로'SQLITE_OK'를 얻지 못하면'sqlite3_errmsg (mapDB)'를 로깅 할 것을 제안 할 수도 있습니다. – Rob

+1

그리고, 당신은 SQL에 여분의'? '자리 표시자를 가지고 있습니다. 그것은 단지 예일 뿐이므로 중요한 것은 아니지만 단지 FYI입니다. 또한 다음 행의 문자열에서 "\"문자열을 계속 입력 할 필요가 없습니다. 첫 번째 줄의 끝에 닫는 따옴표가없고 다음 줄의 시작 부분에 새로운 여는 따옴표가없는 경우에만 백 슬래시가 필요합니다. 당신이 가지고있는 방식대로, 백 슬래시는 불필요합니다. – Rob