Повторное открытие соединения с помощью ORMLite на Android - PullRequest
2 голосов
/ 14 ноября 2011

Моя ситуация такая.У меня есть OrmLiteBaseActivity, где есть мое главное меню.Когда я нажимаю кнопку, я перехожу в «режим резервного копирования» и хочу загрузить резервную копию sqlite db со своего веб-сайта.Проблема в том, что когда я пытаюсь загрузить файл, я не получаю сообщение об ошибке, но база данных не обновляется, пока я не закрою и снова не открою программное обеспечение.Я хотел бы, чтобы обновление было на лету.

Я пробовал на своей OrmLiteBaseActivity что-то вроде этого:

case BACKUP_ID:
    getHelper().close();
    Intent i = new Intent(this, Backup.class);
    this.startActivity(i);
    return true;

Я перехожу к операции резервного копирования, обновляю файл, тогда я хочу вернуться, но я получил эту ошибку:

11-15 19:27:45.359: ERROR/DatabaseHelper(229): Getting connectionSource called after closed
11-15 19:27:45.359: ERROR/DatabaseHelper(229): java.lang.IllegalStateException
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.getConnectionSource(OrmLiteSqliteOpenHelper.java:78)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.getDao(OrmLiteSqliteOpenHelper.java:171)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at info.dierrelabs.h4m.ormliteinterface.DatabaseHelper.getPlayerDao(DatabaseHelper.java:159)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at info.dierrelabs.h4m.team.TeamList.onCreate(TeamList.java:20)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at android.os.Looper.loop(Looper.java:123)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at android.app.ActivityThread.main(ActivityThread.java:4363)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at java.lang.reflect.Method.invokeNative(Native Method)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at java.lang.reflect.Method.invoke(Method.java:521)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
11-15 19:27:45.359: ERROR/DatabaseHelper(229):     at dalvik.system.NativeStart.main(Native Method)

Есть что-то, что я пропускаю?Я предполагал, что использование OrmLiteBaseActivity будет открывать базу данных каждый раз, когда я открываю новую OrmLiteBaseActivity.Я что-то не так делаю?

Ответы [ 2 ]

5 голосов
/ 16 ноября 2011

Вы не делаете что-то неправильно, но делаете что-то нетипичное.

В OrmLiteSqliteOpenHelper.getConnectionSource() регистрируется ошибка, потому что кто-то пытается получить источник соединения после того, как close() был вызван:

public ConnectionSource getConnectionSource() {
    if (!isOpen) {
        // we don't throw this exception, but log it for debugging purposes
        logger.error(new IllegalStateException(), 
                    "Getting connectionSource called after closed");
    }
    return connectionSource;
}

Вы можете переопределить этот метод в вашем помощнике, чтобы не выдать сообщение:

private ConnectionSource connectionSource = null;
@Override
public ConnectionSource getConnectionSource() {
    if (connectionSource == null) {
        connectionSource = super.getConnectionSource();
    }
    return connectionSource;
}

Это исправит сообщение журнала ошибок, но вопрос в том, является ли копияи новая база данных работает.Возможно, вы захотите взглянуть на пример кода двух баз данных.Он поддерживает свои собственные счетчики базы данных и тому подобное, что вам, возможно, придется сделать:

http://ormlite.com/docs/android-hello-two-dbs

2 голосов
/ 29 ноября 2011

Так что я решил это. Когда пользователь нажимает кнопку резервного копирования, вот что происходит:

case BACKUP_ID:
    getHelper().close();
    Intent i = new Intent(this, Backup.class);
    this.startActivity(i);
    return true;

тогда мне нужно снова открыть это соединение. Вы можете сделать это так (после того, как я поменял местами файлы sqlite):

            DatabaseHelper db = new DatabaseHelper(Backup.this);
            db.getWritableDatabase();

Класс Backup просто расширяется Activity.

...