OrmLite java.lang.IllegalStateException: 在使用 dao 之前必须先调用 initialize()

OrmLite java.lang.IllegalStateException: you must call initialize() before you can use the dao

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

我在尝试获取 DAO 以保留对象时遇到此异常。

文档说我必须调用 initialize() 方法才能使用 DAO,而 OrmLite 文档(不充分)说:

BaseDaoImpl (class)
initialize(): Initialize the various DAO configurations after the various setters have been called.

问题是,我通过调用 getDao(class) 获得了 DAO,但没有 initialize() 可以在 DAO 上或扩展 [=19 的 class 中调用=].

这是我的自定义OpenHelperclass代码:

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.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)

编辑:在此处添加了一个名为 SiacApplicationApplication subclass,onCreate() 方法代码(也在清单上注册):

@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;
}

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

在我的例子中,只为 DAO 创建包装器 类 有帮助,因为没有带有此类参数的 getDao() 方法变体。

所以我创建了包装器

class BarrioDao {
  public BarrioDao(ConnectionSource connectionSource) throws SQLException{
        super(connectionSource, Barrio.class); 
 }
}

getter 对于 LocalDBHelper 中的 dao 看起来像:

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

每个人都遇到了这个错误,

为什么会出现此错误:

当开始创建您的 DAO 时,任何 运行时异常 都会 中断 您的 DAO 初始化 并且它让你得到这个错误。

如何解决:

1 - 检查 DaoHelper class.

中每次抛出的 ORMlite 和 SQLite 异常

2 - 尝试更正您遇到的每个错误并停止可能抛出的每个异常。

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

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

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

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