약 7000 개의 행이 장치의 (Android galaxy tab2) sqlite 데이터베이스에 삽입됩니다. 현재 JSON 파일을 파싱하고 "for"루프를 사용하여 데이터베이스에 행을 삽입하고 있습니다. 그러나 그것의 파싱 및 sqlite 데이터베이스에 데이터를 삽입 120 초 이상 걸립니다. 이 작업을 수행하는 다른 빠른 방법이 있습니까?sqlite 데이터베이스에 행을 삽입하는 가장 빠른 방법은 무엇입니까
감사합니다 ...
약 7000 개의 행이 장치의 (Android galaxy tab2) sqlite 데이터베이스에 삽입됩니다. 현재 JSON 파일을 파싱하고 "for"루프를 사용하여 데이터베이스에 행을 삽입하고 있습니다. 그러나 그것의 파싱 및 sqlite 데이터베이스에 데이터를 삽입 120 초 이상 걸립니다. 이 작업을 수행하는 다른 빠른 방법이 있습니까?sqlite 데이터베이스에 행을 삽입하는 가장 빠른 방법은 무엇입니까
감사합니다 ...
나는 똑같은 상황에 처했습니다. 먼저 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");
}
}
여기 아이디어는 그들은 단지 하나 개의 큰 커밋 않는 끝에 다음, 객체의 배열의 삽입을 할 것입니다. 이 전환 후 인서트가 거의 즉시 나타납니다.
@ wangyyif2 : 고마워, 이걸 시도해 볼게. 희망이 작동합니다 :-) – RHL
현재 위치 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 걸림)
데이터베이스 트랜잭션 사용. –
하나의 쿼리로 모든 데이터를 삽입 할 수 있습니까? 또는 일괄 처리 당 500 개씩 처리 할 수 있습니까? – dongshengcn
또 다른 아이디어는 sqlite 데이터에 미리 삽입하고 어딘가에 데이터베이스 파일을 호스팅하고 파일을 다운로드하여 직접 열 수 있습니다. 그것은 오히려 극적인 변화입니다. – dongshengcn