首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android ORMLite

Android ORMLite
EN

Stack Overflow用户
提问于 2014-04-24 12:27:35
回答 2查看 1.7K关注 0票数 2

我在android 4.47上使用了莫来特。一切都很好,但有时当运行应用程序时,我会收到下一个原因的异常:

代码语言:javascript
复制
you must call initialize() before you can use the dao

在我的应用程序类中,我是init,类似于写进是doc。

代码语言:javascript
复制
DatabaseFactory.setHelper(applicationContext);

怎么回事?这个例外我不经常收到。一天一次吧。

完整堆栈:

代码语言:javascript
复制
 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)

Init:

代码语言:javascript
复制
    public class DSApplication extends Application {

        private static Context applicationContext;

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

第一次调用:调用片段生命周期法onViewCreated(.);

代码语言:javascript
复制
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();
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-24 13:27:20

我从未使用过ORMLite,但mt猜测这是因为您的applicationContext总是空的,因此它认为它不是非无效的。

代码语言:javascript
复制
public class DSApplication extends Application {

    private static Context applicationContext;

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

Stack Overflow用户

发布于 2016-07-07 08:53:56

试着使用

代码语言:javascript
复制
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);
    }
}

相反,

代码语言:javascript
复制
Dao<YourClass, Integer> yourDao = OrmLiteSqliteOpenHelper.getDao(YourClass.class);

调用YourDao.queryBuilder()之前

BaseDaoImpl调用初始化()的构造函数

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23268873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档