【问题标题】:Ormlite setup without using base activities不使用基础活动的 Ormlite 设置
【发布时间】:2011-10-05 03:54:14
【问题描述】:

我在一个 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(如果还没有的话)。

谁能告诉我这是对还是错,或者我是否走在正确的道路上?

谢谢!

【问题讨论】:

    标签: java android ormlite


    【解决方案1】:

    我在一个 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()?您必须为每个 get 增加一个计数,并且只有在计数器返回 0 时才调用 release。但即便如此,我也不能 100% 确定您将从活动类中节省多少行。

    【讨论】:

    • DataAccess 方法背后的想法是执行该类中的所有数据操作。它有时在活动中使用,有时在后台使用。这是错误的使用方式吗?
    • 我已经编辑了我的答案@Matt,其中包含有关集中式静态类的详细信息。
    • 类必须是静态的吗?如果我在 onCreate 上创建了集中类,并在集中类中调用了一个方法来释放 onDestroy 中的 helper 呢?那不是做同样的事情吗?
    • 这很好,但如果你的每个Activity 类都这样做,那么就会有多个实例。您只需要以某种方式确保这个集中式类只有一个实例。
    • @Gray 如果 DataAccess 类是一个具有 getInstance() 方法并将 Context 作为参数的单例怎么办? getInstance() 方法(或私有构造函数)可以进行类似 OpenHelperManager.getHelper(context.getApplicationContext() 的调用。这仍然有效吗?另外,如果单例是这样构造的,是否还需要调用 releaseHelper?
    【解决方案2】:

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

    电话

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

    查找DBHelper 类并为上下文实例化它。如果你在你的 strings.xml 中定义了它,你可以在最后去掉 DBHelper.class。

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

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

    【讨论】:

    • 如何在strings.xml中定义数据库类?
    • com.foo.bar.DatabaseHelper
    • 那个字段是字符串的味道。它可以很容易地在AndroidManifest.xml 中变成&lt;meta-data&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多