2011-07-01 6 views
3

CursorAdapter를 사용하여 일부 데이터를 표시하는 ListActivity가 있습니다. 이 데이터는 웹 서비스 호출의 결과입니다.데이터베이스 쓰기 속도 향상

org.json. * 라이브러리를 사용하여 웹 서비스 호출의 응답을 받고 구문 분석 한 다음 응용 프로그램의 SQLite3 데이터베이스에 결과를 기록합니다. 그러면 ListActivity의 커서가 다시 쿼리되고 데이터가 목록에 표시됩니다.

제 문제는 데이터베이스 쓰기가 너무 느립니다. 내가 할 수있는 유일한 생각은 CursorAdapter를 사용하지 않고이 데이터를 메모리에 보관하는 것입니다. 나는 누군가가 속력을 높이기위한 또 다른 제안을하기를 바랬다. 아마도 일종의 대량 삽입물일까요?

내 삽입 작업을하기 위해 ContentProvider를 사용하고 있습니다. 그래서 getContentResolver(). insert (...)를 호출합니다.

시간 응답 : 178ms

JSON 분석 시간 : 쓰기 16ms

시간 여기

는 LAN을 통해 데이터의 56 행에서 검색하고이를 표시 시험에서 몇 배 데이터베이스에 56 행 : 5714ms

이 데이터 양에 대해 데이터베이스 쓰기 시간이 궁극적으로 1000ms 미만일 것입니다.

+0

코드를보고 싶습니다.이 코드는 매우 느립니다. –

+0

트랜잭션을 사용하여 블록으로 데이터를 DB에 씁니까? – thaussma

+0

getContentResolver(). (...)에서 getContentResolver(). bulkInsert (...)로 변경된 ContentProvider – Andrew

답변

2

한 번 문제가 발생하여 데이터베이스에서 beginTransaction()을 호출 한 후 삽입 쿼리를 실행 한 후 발견되었습니다. 예제 코드 :

public void insertClassBatch(ArrayList<Class> batch) throws Exception 
{ 
    this.getWritableDatabase().beginTransaction(); 
    for (Class c : batch) 
    { 
     this.insertClassStatement.bindString(1, c.getClassName()); 
     this.insertClassStatement.bindString(2, c.getClassValue()); 
     this.insertClassStatement.executeInsert(); 
    } 
    this.getWritableDatabase().setTransactionSuccessful(); 
    this.getWritableDatabase().endTransaction(); 
} 

이 경우 약 30 초에서 300ms 정도까지 100 줄 (이 상황에서 일괄 처리의 크기)을 줄입니다.

0

데이터베이스에 쓰는 모든 행에 대해 왕복을합니까? 아니면 모두를 단일 왕복으로 배치 할 수 있습니까? 배치 작업을하지 않는다면 네트워크 지연이 범인이라고 나는 확신한다.

+0

을 사용하고 있음을 보여주기 위해 OP를 업데이트했습니다. 이로 인해 지연 시간이 줄어들었지만 그다지 크지는 않습니다. 나는 약 700ms를 떨어 뜨 렸으며, 여전히 5000ms 이상을 버렸다. – Andrew