2014-01-21 2 views
0

sqlite 데이터베이스에 약 500 개의 레코드를 삽입하려고하는데 너무 길다. 아무도 이것을 최적화하는 방법을 알려주십시오.데이터베이스 삽입에 너무 많은 시간이 걸린다. ios sqlite

for (int i = 0 ; i< [[[dic objectForKey:@"response" ]objectForKey:@"requete"]count]; i++) { 
     [sqlManager executeQuery:[[[dic objectForKey:@"response"]objectForKey:@"requetes"]objectAtIndex:i]]; 
    } 

-(void)executeQuery:(NSString*)_query 
{ 
sqlite3 *database; 
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 

    if(sqlite3_exec(database, [_query UTF8String],NULL, NULL, NULL) == SQLITE_OK){ 
     //NSLog(@"Query Success"); 
    } 
    else{ 
     // NSLog(@"Query Failed"); 
    } 
    sqlite3_close(database); 
} 
sqlite3_close(database); 
} 
+2

한 번만 엽니 다. 그런 다음 여러 번 삽입하는 경우 트랜잭션을 시작하십시오. –

+0

FMDB https://github.com/ccgus/fmdb를 사용하면 롤백에 대한 걱정없이 트랜잭션을 사용할 수 있습니다. – amar

+2

** 모든 작업 **을 열거 나 닫을 필요가 없습니다 **. SQLite는 DB가 열린 상태에서 앱이 다운되면 데이터를 보존한다는 측면에서 매우 강력합니다. 트랜잭션을 시작하지 않는 한 각 연산 후에 암시 적으로 발생하는 "커밋"을 완료하면 데이터가 디스크에 기록됩니다. –

답변

1
  1. 한 번 열어서 앱이 닫힐 때까지 열거 나 DB 강렬한 단계를 마친다. SQLite는 DB가 열린 상태에서 앱이 "충돌"하면 쉽게 상황을 처리 할 수 ​​있습니다.
  2. 여러 개의 인서트를 함께 닫을 때, 둘 중 하나라도 실행되거나 아무 것도 실행되지 않는 경우, 트랜잭션을 시작하고 완료되면 커밋합니다. 명시 적으로 트랜잭션을 시작하지 않으면 SQLite는 각 삽입 또는 업데이트 주위에 암시 적 시작/커밋을 수행하여 데이터를 "디스크"에 "강제"합니다. 이것은 많은 시간이 걸립니다. 일련의 삽입을 시작/커밋하면 삽입 성능이 적어도 10 배 증가합니다.
+0

나는 그것을 위해 당신의 다음과 같은 해결책을 사용했다. 그러나 나는 백그라운드에서 서버에서 오는 몇몇 레코드를 업데이트하기 위해 또 하나의 일을한다. 그리고 그것은 '충돌'이다. 나 한테 해결책을 주시겠습니까? – ilesh

+0

@ilesh - "백그라운드에서"하는 일을하는 경우 많은 사람들이 제대로 일련 화되지 않을 것입니다. –

1

와 함께 당신은 Open & closing the database for every Query(insertion)하려고합니다. 그래서 시간도 걸립니다.

example 한 번에 여러 레코드를 삽입하는 경우.

+0

어디에서 거래를 시작 했습니까? –

+0

준비가 실패하면 DB를 열어 두십시오. –

+0

@HotLicks 좋아요. 샘플을 다시 게시했습니다. 이는 단지 참고 용례 일뿐입니다. 나는 완전한 해결책을 제공 할 수 없다. 좋아 ....? –

0

데이터베이스를 열어 두어야한다고 생각합니다.

데이터베이스를 열고 닫는 데 더 많은 시간이 소요됩니다.

예를 들어 firts 요소에서 데이터베이스를 연 다음 마지막 요소를 닫는 삽입 메서드 만 만듭니다.

관련 문제