12

我在一个 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如果它还没有。

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

谢谢!

4

2 回答 2

15

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

你在正确的轨道上,但有点偏离@Matt。坦率地说,如果不扩展我们的基类,我从来没有做过一个项目。但这是一个很好的练习,所以我创建了这个ORMLite 示例项目,它使用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()需要作为第一个参数。ContextActivity

编辑:

如果您确实想创建一个DataAccess类型类来集中处理帮助程序类,那么您需要将方法设为静态并执行您自己的使用计数器。如果有多个活动和后台任务调用getHelper(),那么问题是你什么时候打电话releaseHelper()?您必须为每个 get 增加一个计数,并且只有在计数器返回 0 时才调用 release。但即便如此,我也不能 100% 确定您将从活动类中节省多少行。

于 2011-10-05T14:02:59.603 回答
2

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

通话

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

查找DBHelper类并为上下文实例化它。如果您已在您的 strings.xml 中定义它,您可以在最后省略 DBHelper.class。

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

除此之外,它看起来不错。如果您最终希望 DB 对象的数据辅助方法超出基本 DAO 方法,那么您最终将希望创建对象 DAO 的更彻底的实现,但这是一个好的开始。

于 2011-10-05T05:11:31.140 回答