2016-11-09 6 views
1

Я использую ORMLite для сохранения моего объекта в моем SqliteDatabase в моем приложении.OrmLite java.lang.IllegalStateException: вы должны вызвать initialize(), прежде чем вы сможете использовать dao

Я получаю это исключение, пытаясь получить DAO, чтобы сохранить объект.

В документации сказано, что я должен вызвать метод initialize(), прежде чем я могу использовать DAO, и документация OrmLite (недостаточная) говорит:

BaseDaoImpl (класс)
Initialize(): Инициализация различные конфигурации DAO после того, как были вызваны различные сеттеры.

Проблема заключается в том, я получаю объекты DAO по телефону getDao(class), и нет 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 Monitor:

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) 

EDIT: добавлен Application подкласса под названием SiacApplication, onCreate() метод здесь кода (также зарегистрировано на манифесте):

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

EDIT 2: добавлена ​​ДАО газопоглотитель (дао локальное поле):

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

Я думаю, что ваш ApplicationContext всегда пустой, поэтому он считает, что это не initalized. –

+0

Я изменил свои изменения. Все еще получаю такое же исключение. – sbd2

+0

Что-то не так с вашим экземпляром DAO. Вы уверены, что получили это от помощника? Можете ли вы показать фактический код, который создает dao? – Gray

ответ

1

столкнулись с той же проблемой в Android. Похоже, что при создании DAO требуется отправить ConnectionSource.

В моем случае только создание классов-оболочек для DAO помогло, потому что нет метода getDao() с таким параметром.

Так я создал обертку

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

добытчик для дао в LocalDBHelper выглядел как:

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