2012-05-31 5 views
6

약 1MB의 json 문자열을 다운로드하고 약 1000 개의 요소가 필요한 Android 응용 프로그램을 작성 중이며, 이들 각각을 SQLite 데이터베이스로 구문 분석해야 ListActivity를 채 웁니다.JSite 문자열을 SQLite 테이블로 구문 분석하는 가장 빠른 방법은 무엇입니까?

다운로드 및 구문 분석은 앱과의 모든 상호 작용에서 수행해야하는 작업이 아니지만 (처음 실행하거나 사용자가 데이터를 새로 고침하는 경우에만), 나는 여전히 파싱 파트 너무 오래 걸립니다. 약 2 ~ 3 분 정도 소요됩니다. 전화 앱 이용 약관에서 영원한 것처럼 보입니다.

저는 현재 Gson을 사용하여 각 json 객체를 정의한 사용자 정의 객체로 구문 분석 한 다음 SQLiteOpenHelper를 사용하여 데이터베이스에 입력합니다.

제 질문은 - 구현 방법이 더 빠릅니까? Gson을 사용하지 않고 json과 직접 상호 작용하는 것이 눈에 띄게 빠를까요? 아니면 내가 아래의 코드에서 바보 같은 일을하고있는 것은 속도를 늦추는 것입니까? 여기

내가 SQLite는에 JSON 구문 분석을 내 AsyncTask를에 사용하고 있습니다 방법입니다 :

protected Boolean doInBackground(Integer... bType) { 

    InputStream source = getJsonInputStream(bTypeString); 

    VegDataHandler db = new VegDataHandler(mainActivity, bTypeString); 
    Gson gson = new Gson(); 
    Reader reader = new InputStreamReader(source); 

    JsonParser jParser = new JsonParser(); 
    JsonArray jArray = jParser.parse(reader).getAsJsonArray(); 

    aLength = jArray.size(); 
    mCurrProgress = 1; 
    publishProgress(mCurrProgress, 0, aLength); 

    /* Each array element is of the form { company: {...} } */ 
    int i = 0; 
    mCurrProgress = 2; 
    for (JsonElement obj : jArray) { 
     Company c = gson.fromJson(obj.getAsJsonObject().getAsJsonObject("company"), Company.class); 
     db.addCompany(c); 
     i++; 
     publishProgress(mCurrProgress, i); 
    } 
} 

이 SQLiteOpenHelper를 확장 내 VegDataHandler 클래스에서 addCompany 방법입니다 :

public void addCompany(Company c) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_ID, c.getCompanyId()); 
    values.put(KEY_NAME, c.getCompanyName()); 
    values.put(KEY_RYG, c.getCompanyRedYellowGreen()); 
    values.put(KEY_COUNTRY, c.getCompanyCountry()); 
    values.put(KEY_URL, c.getCompanyUrl()); 
    values.put(KEY_NOTES, c.getCompanyNotes()); 
    values.put(KEY_EMAIL, c.getCompanyEmail()); 
    db.insertWithOnConflict(TABLE_COMPANY, null, values, SQLiteDatabase.CONFLICT_REPLACE); 
    db.close(); 
} 

이를 SQLite에 추가하기 전에 각 json 요소를 보유하는 클래스입니다 (간략하게 getter 및 setter를 생략했습니다).

public class Company { 

    public Company() { 
    } 

    @SerializedName("id") 
    public int companyId; 

    @SerializedName("company_name") 
    public String companyName; 

    @SerializedName("red_yellow_green") 
    public String companyRedYellowGreen; 

    @SerializedName("country") 
    public String companyCountry; 

    @SerializedName("url") 
    public String companyUrl; 

    @SerializedName("notes") 
    public String companyNotes; 

    @SerializedName("email") 
    public String companyEmail; 

} 

미리 답변 해 주셔서 감사합니다.

+0

지연의 이유를 파악하려고 했습니까 - 시간이 걸리거나 다운로드하는 것과 관련이 있습니까? – Rajesh

+0

대량 레코드를 데이터베이스에 추가 하시겠습니까? –

+0

@Rajesh - 확실히 파싱이 가장 많은 시간을 필요로합니다. publishProgress() 메서드를 사용하여 다운로드/파싱/팽창 단계를 보여줍니다. – simick

답변

4

먼저 가장 많은 시간을 소비하는 프로세스의 부분을 결정해야합니다. 위의 귀하의 의견에서 JSON 파싱이 범인 인 것처럼 들립니다.

JSON 구문 분석에 문제가 있는지 :
연구 및 빠른 JSON 파서를 고려한다. 아마도 json-smart과 같은 것일 수 있습니다.

SQLite는/DB 대량 삽입으로 문제가있는 경우 :
See my answer here

일반 팁 :

  • 재활용이 가능한 한 객체
  • (최소 새로운을 유지)
  • DB 벌크 삽입에서 항상 트랜잭션을 최소한
  • 데이터베이스를 열거 나 닫지 마십시오. 처리 시작/완료시 한 번 수행하십시오.
  • 사전 컴파일 된 명령문을 사용하십시오!
+0

이것은 대단히 감사합니다. json-smart와 DB 벌크 인서트를 살펴보고 더 많은 시간을 절약 할 수 있는지 알아 봅니다. – simick

관련 문제