2012-03-19 4 views
2

Android에서 ormlite 4.35를 사용하여 객체 및 객체 세트를로드 중입니다. 아래의 getAllCragsWithLocation() 메서드에서 타이밍을 위해 16에서 19 초 사이 (에뮬레이터에서) 소요됩니다.Android에서 ORMLite로 개체를로드하는 방법을 개선하려면 어떻게해야합니까?

데이터베이스에 590 개의 Crag가 있고 40 곳에 위치가 없습니다.

여러 라인이

03-19 11:03:54.441: I/dalvikvm(1156): Jit: resizing JitTable from 1024 to 2048 
03-19 11:03:55.531: D/dalvikvm(1156): GC_CONCURRENT freed 544K, 37% free 5174K/8199K, external 731K/1109K, paused 6ms+11ms 

나는 개체를 다른 방법을로드해야 하는가 등의 기록이있다? sqlite3를 명령 줄에서 쿼리를 실행하면

public List<Crag> getAllCragsWithLocation() { 
     Log.i(TAG,"beginning db calls"); 
     long startQuery = System.currentTimeMillis(); 
     QueryBuilder<Crag,Integer> queryBuilder = helper.getCragDao().queryBuilder(); 
     List<Crag> results = new ArrayList<Crag>(); 
     try { 
      queryBuilder.where().isNotNull("location_id"); 
      Log.i(TAG,queryBuilder.prepareStatementString()); 
      PreparedQuery<Crag> preparedQuery = queryBuilder.prepare(); 
      results = helper.getCragDao().query(preparedQuery); 
     } catch (android.database.SQLException e) { 
      Log.e(TAG,e.toString()); 
     } catch (SQLException e) { 
      Log.e(TAG,e.toString()); 
     } 
     Log.i(TAG,"ending query after "+((System.currentTimeMillis()-startQuery)/1000)+" seconds"); 
     return results; 
    } 

울퉁불퉁 한 바위 개체 (간체)입니다 ... 초 100의 주위에 취

@DatabaseTable 
    public class Crag { 
     public Crag() { 
      //ormlite requires a no-arg constructor? 
      guidebooks = new ArrayList<Guidebook>(); 
     } 

     @DatabaseField(id=true) private int id; 
     @ForeignCollectionField(eager = true) 
     private Collection<Guidebook> guidebooks; 
     @DatabaseField(foreign=true, foreignAutoRefresh = true, index=true) 
     private uk.co.bmc.rad.models.Location location; 
     @DatabaseField(foreign=true,foreignAutoRefresh=true) 
     private SubRegion subRegion; 
    } 

이물질이 바위보다 훨씬 간단한 클래스입니다. 표시 목적을 위해서만 객체가 데이터베이스에서로드되는 지점에 위치가 필요하지만 평등을 비교할 때 이물을 사용하므로 ...

에서 반환은 추가 준비를 위해 반복됩니다. MapOverlay. 프로세스 타이밍은 1 초도 채 걸리지 않습니다.


UPDATE : 난 그냥 비교 db4o는에서 교환했고 나는 그와 함께 갈 것 같아요 그래서 비교에 의해 본질적으로 즉시 모든 울퉁불퉁 한 바위를로드합니다.


업데이트] UPDATE : 대신 빠르게 db4o는 스와핑 나는 두 가지를 비교하는 더 많은 시간을 보냈어요.

JUnit 3 AndroidTestCase에서 하나의 레코드를 데이터베이스에 삽입 한 다음 ORMLite와 DB4O가 객체를 삽입하고 반환하는 데 약 2 초가 걸리는 경우 직접 쿼리하십시오.

DB40는 칠초 소요) 내가 590 개체를 삽입 내 프로세스를 실행하는 경우 ORMLite 주위 24초 소요 내가 getAllCragsWithLocation() 다음 getAllCrags을 (호출하는 경우 DB40은 삽입 직후 약 40

소요 Crags 목록을 반환하는 데 0 초가 걸리므로 두 번째 쿼리의 속도를 높이는 캐시가 있다고 생각합니다.

ORMLite는 두 쿼리 모두 약 7 초가 걸립니다.

그래서 실제로 아주 작은있다


업데이트]

업데이트] UPDATE : 오늘 트랜스포머 프라임을 잡고 에뮬레이터에 7에 비해 불과 1 초로드가에있는 응용 프로그램과 울퉁불퉁 한 바위를 실행 .

나는 orkite의 쿼리 구문을 이미 익숙하게 했으므로; 원시 SQL에서 다시 떨어질 수 있고 sqlite 테이블 구조가 더 이동 가능합니다. db4o를 통해 ormlite를 고수 할 것입니다.

답변

-1

저는 ContentProvider 사용을 고려해야한다고 생각합니다.2k 행을 조작하는 응용 프로그램을 만들었지 만 쿼리 및 개체 재생성은 에뮬레이터에서 10 초 이내에 수행됩니다.

+0

ContentProvider를 다루기가 힘들어서 ormlite를 테스트하고 있습니다. 끔찍한 마법의 끈이 많은 것 같았습니다. 하지만 당신은 바로 테스트를위한 단순화 된 모델을 가지고 있으며, ContentProvider는 더 나은 성능을 가지고 있습니다. 5 개의 클래스가 포함 된 객체 그래프가있는 Crag 객체를 처리하기 위해 ContentProvider를 확장하면서 ContentProvider를 사용하여이를 구현하는 방법에 대해 혼란스러워했습니다. ormlite를 통해 객체를 추가하는 것이 더 간단한 유지 관리자가 될 수 있기를 바랬습니다 –

+0

android.database.sqlite 패키지 (SQLiteDatabase 및 SQLiteOpenHelper)의 클래스를 사용하여 고유 한 데이터베이스 계층을 만들 수 있습니다. 유지 보수성과 성능면에서 더 좋을 수 있습니다. –

+0

사실이지만 일부 설명이있는 ORM으로 개발하는 데 익숙하며 여기에서 활용하는 것을 선호합니다. –

4

정말 오래 걸리는 것이 놀랍습니다.

@ForeignCollectionField(eager = true) 
    private Collection<Guidebook> guidebooks; 
    @DatabaseField(foreign=true, foreignAutoRefresh = true, index=true) 
    private uk.co.bmc.rad.models.Location location; 
    @DatabaseField(foreign=true,foreignAutoRefresh=true) 
    private SubRegion subRegion; 

각 필드는 초를 기대하지는 않지만 시간이 걸릴 다른 데이터베이스 쿼리를 생성합니다. ORMLite는 열심히 가져온 원격 객체를 충족시키기 위해 JOIN을 사용하는 것이 현명하지 않습니다.

DAO 구현을 생성 할 때 안드로이드의 dog, dog 느린 반사 구현을 해결하기 위해 table-config 프로세스를 사용하는 것이 좋습니다. 그에 대한 문서를 참조하십시오 : 당신이 작업을 진행하는 다른 패키지로 전환해야하는 경우 이해하지만, 당신이 그것을 알아낼 경우

http://ormlite.com/docs/table-config

가 궁금 할 것이다.

+0

외래 객체에 액세스해야 할 때만 새로 고침 메서드를 호출 할 수 있도록 사용할 간단한 패턴이 있습니까? 나는 단지 그것이로드 된 위치에 위치를 필요로한다 ... 흠 ... 이것은 다른 질문이 아니다. ... –

+1

getHelper(). getSubRegionDao(). refresh (crag.subRegion)'를 사용하여 수동으로 새로 고칠 수있다. . 안드로이드 메일 링리스트는 다음을 도울 수 있습니다 : https://groups.google.com/forum/?fromgroups#!forum/ormlite-android – Gray

+0

useGetSet을 subRegion 주석에 추가하고 객체의 값을 테스트하고 필요하면 새로 고침을 생각했습니다. 초기 오버 헤드를 줄일 수 ... 내가 자동으로 새로 고침 된 외국 개체 당 레코드 당 590 레코드를 호출을 생성하는 것 같아요? –

관련 문제