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

Mat*_* W. 12 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
Run Code Online (Sandbox Code Playgroud)

我们的想法是创建DataAccess类,并创建它,DBHelper如果它还没有.

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

谢谢!

Gra*_*ray 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Dao<SomeObject, Integer> someObjectDao = getHelper().getSomeObjectDao();
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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