我在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
(如果尚未创建)。
有人可以告诉我这是对还是错,或者我是否走在正确的道路上?
谢谢!
答案 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的更全面的实现,但这是一个良好的开端。