在Android上使用ORMLite重新打开连接

时间:2011-11-14 19:57:00

标签: android sqlite testing ormlite

我的情况是这样的。我有一个OrmLiteBaseActivity,其中有我的主菜单。当我按下按钮时,我进入“备份模式”,我想从我的网站下载备份sqlite数据库。 问题是,当我尝试上传文件时,我没有得到任何错误但数据库没有更新,直到我关闭并重新打开软件。我希望更新能够即时进行。

我尝试过像我这样的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都会重新打开db。我做错了吗?

2 个答案:

答案 0 :(得分:5)

你没有做错事,但你做的事情非典型。

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

答案 1 :(得分:2)

所以我解决了。当用户按下备份按钮时,会发生以下情况:

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