没有使用基本活动的Ormlite设置

时间:2011-10-05 03:54:14

标签: java android ormlite

我在android项目中使用ORMLite,我不想使用扩展活动,因为我在AsyncTask上将值插入数据库。

在文档中说:

“如果您不想扩展OrmLiteBaseActivity和其他基类,则需要复制其功能。您需要在代码开头调用OpenHelperManager.getHelper(Context context, Class openHelperClass),保存帮助程序并根据需要使用它,然后在完成后调用OpenHelperManager.release()。“

它还说要在我strings.xml中添加数据库助手类。所以我不确定我做错了什么。

我正在使用一个名为DataAccess的类作为我的数据层,如下所示:

public class DataAccess {
    private Context context;
    private DBHelper dbHelper;

    public DataAccess(Context _context) {
        this.context = _context;
        dbHelper = getDBHelper(_context);
    }

    private DBHelper getDBHelper(Context context) {
        if (dbHelper == null) {
            dbHelper = (DBHelper) OpenHelperManager.getHelper(context, DBHelper.class);
        }
        return dbHelper;
    }
}

我正在使用扩展的助手类:

public class DBHelper extends OrmLiteSqliteOpenHelper {
    private static final String DATABASE_NAME = "database.db";
    private static final int DATABASE_VERSION = 1;

    private Dao<SomeObject, Integer> someObjectTable = null;
    private ConnectionSource connectionSource = null;

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
        this.connectionSource = connectionSource;
        try {
            TableUtils.createTable(connectionSource, SomeObject.class);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
    }

    public Dao<SomeObject, Integer> getSomeObjectDao() throws SQLException {
        if (someObjectTable == null) {
            dateTable = getDao(SomeObject.class);
        }
        return someObjectTable;
    }

我们的想法是创建DataAccess类,并让它创建DBHelper(如果尚未创建)。

有人可以告诉我这是对还是错,或者我是否走在正确的道路上?

谢谢!

2 个答案:

答案 0 :(得分:15)

  

我在android项目中使用ORMLite,我不想使用扩展活动,因为我在AsyncTask上将值插入数据库。

你走在正确的轨道上但是@Matt稍微离开了。坦率地说,如果不扩展我们的基类,我就不会完成一个项目。但这是一个很好的练习,所以我创建了这个ORMLite example project使用Activity并管理自己的帮助。

您的DBHelper课程没问题,但实际上您不需要DataAccess课程。在您的每项活动(或服务......)中,您需要具备以下内容:

private DBHelper dbHelper = null;

@Override
protected void onDestroy() {
    super.onDestroy();
    if (dbHelper != null) {
        OpenHelperManager.releaseHelper();
        dbHelper = null;
    }
}

private DBHelper getHelper() {
    if (dbHelper == null) {
        dbHelper = (DBHelper)OpenHelperManager.getHelper(this, DBHelper.class);
    }
    return dbHelper;
}

你[显然],然后通过做类似的事情在你的代码中使用它:

Dao<SomeObject, Integer> someObjectDao = getHelper().getSomeObjectDao();

因此,无论何时第一次调用getHelper(),它都会通过管理器获取帮助程序,建立与数据库的连接。每当您的应用程序被操作系统销毁时,它都会释放帮助程序 - 如果它是最后一个版本,可能会关闭底层数据库连接。

请注意,OpenHelperManager.getHelper()需要Context作为第一个参数,以防您在没有Activity基类的情况下执行此操作。

修改

如果您确实想要创建一个DataAccess类型类来集中处理帮助程序类,那么您需要使方法保持静态并执行您自己的使用计数器。如果有多个活动和后台任务调用getHelper(),那么问题是您何时致电releaseHelper()?当计数器回到0时,你必须为每次获取增加一个计数,并且只有呼叫释放。但即使这样,我也不能100%确定你从活动类中保存了多少行。

答案 1 :(得分:2)

我可以挑剔,但基本上你做得正确。

电话

dbHelper = (DBHelper) OpenHelperManager.getHelper(context, DBHelper.class);

查找DBHelper类并为上下文实例化它。如果您已在strings.xml中定义它,则可以在结尾处取消DBHelper.class。

onUpgrade中的

DBHelper.java,您可能需要考虑删除您在onCreate中创建的表格,然后调用onCreate(以确保您没有转换)从更新到更新的问题)。如果您愿意,可以进行更复杂的更新。

除此之外,它看起来不错。如果您希望数据库对象的数据附件方法超出基本DAO方法,您最终将希望创建对象DAO的更全面的实现,但这是一个良好的开端。