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 中调用=].
这是我的自定义OpenHelper
class代码:
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)
编辑:在此处添加了一个名为 SiacApplication
的 Application
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。
我正在使用 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 中调用=].
这是我的自定义OpenHelper
class代码:
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)
编辑:在此处添加了一个名为 SiacApplication
的 Application
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。