안드로이드 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();
}
YourDao.queryBuilder를 호출하면 경쟁 조건을 것 같은데. 예외는 백그라운드 스레드에서 트리거됩니다. 내 생각 엔, 초기화 코드를 보지 않고, 메인 스레드에서 DAO를 초기화하고 백그라운드에서 액세스하려고하는 것입니다. 매번 액세스가 초기화되기 전에는 경쟁 조건이 발생합니다. – jacobhyphenated
내가 할 수있는 일은 무엇입니까? 배경 스레드에서 DAO 클래스의 객체가 필요합니까? – smail2133
ORMLite를 초기화하는 코드를 표시하십시오. 백그라운드 스레드가 시작되는 위치를 표시합니다. – jacobhyphenated