OrmLite java.lang.IllegalStateException:必须先调用initialize()才能使用dao

时间:2016-11-09 16:55:20

标签: android dao ormlite

我正在使用ORMLite将我的对象保存在我的应用中的SqliteDatabase

我在尝试获取DAO以便持久保存对象时遇到此异常。

文档说我必须在使用DAO之前调用initialize()方法,而OrmLite文档(不足)说:

  

BaseDaoImpl(class)
  initialize():在调用各种setter之后初始化各种DAO配置。

问题是,我通过调用getDao(class)来获取DAO,并且没有initialize()我既不能在DAO上调用,也不能在我的类中调用OrmLiteSqliteOpenHelper

这是我的自定义OpenHelper类代码:

public class LocalDBHelper extends OrmLiteSqliteOpenHelper {
  private LocalDBHelper(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }

  public static LocalDBHelper getInstance(Context context) {
    if (instance == null) instance = new LocalDBHelper(context);
    return instance;
  }

  @Override
  public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
    try {
        TableUtils.createTable(connectionSource, Barrio.class);
        TableUtils.createTable(connectionSource, Fenomeno.class);
        TableUtils.createTable(connectionSource, Info.class);
        TableUtils.createTable(connectionSource, TelefonoUtil.class);
        TableUtils.createTable(connectionSource, Alarma.class);
        TableUtils.createTable(connectionSource, ReplicaAlerta.class);
    } catch (SQLException e) {
        e.printStackTrace();
        Log.d(TAG, e.getMessage());
    }
  }

  @Override
  public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion) {
    try {
        TableUtils.dropTable(connectionSource, Barrio.class, true);
        TableUtils.dropTable(connectionSource, Fenomeno.class, true);
        TableUtils.dropTable(connectionSource, Info.class, true);
        TableUtils.dropTable(connectionSource, TelefonoUtil.class, true);
        TableUtils.dropTable(connectionSource, Alarma.class, true);
        TableUtils.dropTable(connectionSource, ReplicaAlerta.class, true);
    } catch (SQLException e) {
        e.printStackTrace();
        Log.d(TAG, e.getMessage());
    }
  }

这是Android监视器的完整堆栈:

java.lang.IllegalStateException: you must call initialize() before you can use the dao
        at com.j256.ormlite.dao.BaseDaoImpl.checkForInitialized(BaseDaoImpl.java:1061)
        at com.j256.ormlite.dao.BaseDaoImpl.create(BaseDaoImpl.java:316)
        at com.org.siam.app.controller.BarrioController.actualizarTodos(BarrioController.java:75)
        at com.org.siam.app.remote.BarriosWebService.onResponse(BarriosWebService.java:43)
        at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

编辑:在这里添加了一个Application子类SiacApplicationonCreate()方法代码(也在清单上注册):

@Override
public void onCreate() {
    super.onCreate();
    LocalDBHelper.getInstance(this);
}

编辑2:添加了DAO getter(DAO是本地字段):

    public Dao<Barrio, Long> getBarrioDao() throws SQLException {
    if (barrioDao == null) barrioDao = getDao(Barrio.class);
    return barrioDao;
}

3 个答案:

答案 0 :(得分:1)

在Android中遇到同样的问题。似乎在创建DAO时需要发送ConnectionSource。

在我的情况下,只为DAO创建包装类有帮助,因为没有这种参数的getDao()方法变体。

所以我创建了包装器

class BarrioDao {
  public BarrioDao(ConnectionSource connectionSource) throws SQLException{
        super(connectionSource, Barrio.class); 
 }
}
在LocalDBHelper中,dao的getter看起来像:

public BarrioDao getBarrioDao() throws SQLException {
    if (barrioDao == null) barrioDao = new BarrioDao(getConnectionSource());
    return barrioDao;
}

答案 1 :(得分:0)

每个人都遇到此错误,

为什么会出现此错误:

开始创建DAO时,任何运行时异常都会中断您的 DAO初始化,这使您收到此错误。

如何解决它:

1-从DaoHelper类中检查每个抛出的ORMlite和SQLite异常。

2-尝试更正遇到的每个错误,并停止可能引发的每个异常。

3-开始创建DAO时,在没有任何运行时异常的情况下运行应用程序。

答案 2 :(得分:0)

遇到了同样的问题,并意识到这是由于更改了我的一个数据库字段的名称并在没有重新生成 ormlite_config.txt 的情况下运行代码引起的。

当 ORMLite 系统尝试加载我的类配置并初始化 DAO 时,它看到 ormlite_config.txt 中的配置说有一个名为 oldname 的字段名,然后查看了 java 类定义并没有没有看到 oldname 的实例变量,因此它抛出了一个异常,从而破坏了进程的其余部分。

因此,如果您遇到此错误,请确保重新生成 ormlite_config.txt 文件并再次尝试运行。