2013-04-18 3 views
3

약 7000 개의 행이 장치의 (Android galaxy tab2) sqlite 데이터베이스에 삽입됩니다. 현재 JSON 파일을 파싱하고 "for"루프를 사용하여 데이터베이스에 행을 삽입하고 있습니다. 그러나 그것의 파싱 및 sqlite 데이터베이스에 데이터를 삽입 120 초 이상 걸립니다. 이 작업을 수행하는 다른 빠른 방법이 있습니까?sqlite 데이터베이스에 행을 삽입하는 가장 빠른 방법은 무엇입니까

감사합니다 ...

+3

데이터베이스 트랜잭션 사용. –

+1

하나의 쿼리로 모든 데이터를 삽입 할 수 있습니까? 또는 일괄 처리 당 500 개씩 처리 할 수 ​​있습니까? – dongshengcn

+0

또 다른 아이디어는 sqlite 데이터에 미리 삽입하고 어딘가에 데이터베이스 파일을 호스팅하고 파일을 다운로드하여 직접 열 수 있습니다. 그것은 오히려 극적인 변화입니다. – dongshengcn

답변

1

나는 똑같은 상황에 처했습니다. 먼저 DatabaseUtil.insertHelper를 사용하고 있었고 600 항목에 대해 +30 초가 걸렸습니다.

나는 조금 더 파고 들었고 내가 삽입하는 모든 행이 커밋되고 있음을 알았다. 이것은 매우 비싸다. 이 문제를 해결하려면

, 나는 insertAll 방법으로, ORMLite로 전환 :

/** 
* Inserts multiple objects into the database quickly by committing them all at once 
* 
* @param objects The objects to insert 
*/ 
public void insertAll(final T[] objects) { 
    try { 
     dao.callBatchTasks(new Callable<Void>() { 

     @Override 
     public Void call() throws Exception { 
      for (T object : objects) { 
       dao.create(object); 
      } 
      return null;  
     } 
     }); 
    } catch (Exception e) { 
    AdbLogger.error("Error inserting new " + className + "s in the database"); 
} 
} 

여기 아이디어는 그들은 단지 하나 개의 큰 커밋 않는 끝에 다음, 객체의 배열의 삽입을 할 것입니다. 이 전환 후 인서트가 거의 즉시 나타납니다.

+0

@ wangyyif2 : 고마워, 이걸 시도해 볼게. 희망이 작동합니다 :-) – RHL

0

현재 위치 statements

database.beginTransaction(); 
SQLiteStatement stmt = database.compileStatement(sql); 

for (int i = 0; i < NUMBER_OF_ROWS; i++) { 
    //generate some values 

    stmt.bindString(1, randomName); 
    stmt.bindString(2, randomDescription); 
    stmt.bindDouble(3, randomPrice); 
    stmt.bindLong(4, randomNumber); 

    long entryID = stmt.executeInsert(); 
    stmt.clearBindings(); 
} 

database.setTransactionSuccessful(); 
database.endTransaction(); 

Reference

삽입이 두 방법 사이의 비교가 주어진다 one more link이다 사용해야한다. (100 레코드의 경우 정상 삽입은 1657ms, endTransaction()의 문장은 92ms 걸림)

관련 문제