2014-04-24 2 views
2

안드로이드 4.47 용 ormlite를 사용하고 있습니다. 모두 훌륭하지만 응용 프로그램을 실행 때로는 때 다음 원인을 예외가 나타납니다 문서입니다에 내가 초기화 쓰기처럼 ormlite있어 내 응용 프로그램 클래스에서Android ORMLite

you must call initialize() before you can use the dao 

합니다.

DatabaseFactory.setHelper(applicationContext); 

무슨 일입니까? 자주받는 예외는 아닙니다. 어쩌면 하루에 한 번.

풀 스택 :

java.lang.RuntimeException: An error occured while executing doInBackground() 
      at android.os.AsyncTask$3.done(AsyncTask.java:300) 
      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
      at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
      at java.lang.Thread.run(Thread.java:841) 
    Caused by: java.lang.IllegalStateException: you must call initialize() before you can use the dao 
      at com.j256.ormlite.dao.BaseDaoImpl.checkForInitialized(BaseDaoImpl.java:925) 
      at com.j256.ormlite.dao.BaseDaoImpl.queryBuilder(BaseDaoImpl.java:247) 
      at com.j256.ormlite.dao.BaseForeignCollection.getPreparedQuery(BaseForeignCollection.java:174) 
      at com.j256.ormlite.dao.EagerForeignCollection.<init>(EagerForeignCollection.java:38) 
      at com.j256.ormlite.field.FieldType.buildForeignCollection(FieldType.java:784) 
      at com.j256.ormlite.stmt.mapped.BaseMappedQuery.mapRow(BaseMappedQuery.java:82) 
      at com.j256.ormlite.stmt.SelectIterator.getCurrent(SelectIterator.java:270) 
      at com.j256.ormlite.stmt.SelectIterator.nextThrow(SelectIterator.java:161) 
      at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:200) 
      at com.j256.ormlite.stmt.StatementExecutor.queryForAll(StatementExecutor.java:118) 
      at com.j256.ormlite.dao.BaseDaoImpl.queryForAll(BaseDaoImpl.java:239) 
      at com.ls.dailysteals.core.database.dao.HeistDAO.getAllHeist(HeistDAO.java:31) 
      at com.ls.dailysteals.ui.fragment.HeistFragment$1.doInBackground(HeistFragment.java:92) 
      at com.ls.dailysteals.ui.fragment.HeistFragment$1.doInBackground(HeistFragment.java:88) 
      at android.os.AsyncTask$2.call(AsyncTask.java:288) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
      at java.lang.Thread.run(Thread.java:841) 

초기화 :

public class DSApplication extends Application { 

     private static Context applicationContext; 

     @Override 
     public void onCreate() { 
      super.onCreate(); 
      DatabaseFactory.setHelper(applicationContext); 
    } 
} 

첫 번째 통화 : 단편 lifecyrcle 메소드 호출은 onViewCreated (...);

databaseTask = new AsyncTask<Object, List<ShortDeal>, List<ShortDeal>>() { 

      @Override 
      protected List<ShortDeal> doInBackground(Object... params) { 
       return DatabaseFactory.getHelper().getShortDealDAO().getAllShortDeal(); 
      } 

      @Override 
      protected void onPostExecute(List<ShortDeal> shortDeals) { 
       super.onPostExecute(shortDeals); 
       updateAdapter(shortDeals); 
      } 
     }; 

     if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { 
      databaseTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
     } else { 
      databaseTask.execute(); 
     } 
+3

YourDao.queryBuilder를 호출하면 경쟁 조건을 것 같은데. 예외는 백그라운드 스레드에서 트리거됩니다. 내 생각 엔, 초기화 코드를 보지 않고, 메인 스레드에서 DAO를 초기화하고 백그라운드에서 액세스하려고하는 것입니다. 매번 액세스가 초기화되기 전에는 경쟁 조건이 발생합니다. – jacobhyphenated

+0

내가 할 수있는 일은 무엇입니까? 배경 스레드에서 DAO 클래스의 객체가 필요합니까? – smail2133

+0

ORMLite를 초기화하는 코드를 표시하십시오. 백그라운드 스레드가 시작되는 위치를 표시합니다. – jacobhyphenated

답변

0

내가 ORMLite을 사용한 적이 있지만, MT, 따라서 그것 대신

YourDao dao = new YourDao(OrmLiteSqliteOpenHelper.getConnectionSource(), YourDao.class); 

public class YourDao extends BaseDaoImpl<YourClass, Integer> {  
    protected YourDao(ConnectionSource connectionSource, Class<YourClass> dataClass) throws SQLException { 
     super(connectionSource, dataClass); 
    } 
} 

를 사용하는

public class DSApplication extends Application { 

    private static Context applicationContext; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     applicationContext = this; 
     DatabaseFactory.setHelper(this); 
    } 
    .... 
+0

나는 아주 드물게 오류가 발생하기 때문에 이것은 잘못된 것입니다. 항상 그런 것은 아닙니다. 하지만 이걸 사용 해보니, 당신의 대답에 감사드립니다. – smail2133

+0

어쩌면 DatabaseFactory.setHelper (context) 호출을 다른 곳에서 호출했을 수도 있고 대부분의 조건에서 다른 연산 전에 호출되기 때문에 작동할까요? –

+0

아니요, 제외되었습니다! 나는 한 번만 DatabaseFactory.setHelper (context)를 호출한다. 내 응용 프로그램 클래스! – smail2133

1

시도를 initalized 아니에요 생각, 당신의 ApplicationContext는 항상 null이기 때문에이 추측

Dao<YourClass, Integer> yourDao = OrmLiteSqliteOpenHelper.getDao(YourClass.class); 

전()

생성자 BaseDaoImpl의 호출 초기화()