gpt4 book ai didi

java - 不使用基本 Activity 的 Ormlite 设置

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:28 27 4
gpt4 key购买 nike

我正在使用 ORMLite在 android 项目中,我不想使用扩展 Activity ,因为我在 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

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

谢谢!

最佳答案

I'm using ORMLite in an android project, and I'm not wanting to use the extended activities because I'm inserting values into the database on an AsyncTask.

您走在正确的轨道上,但有点偏离@Matt。坦率地说,我从来没有在不扩展我们的基类的情况下完成过一个项目。但这是一个很好的练习,所以我创建了这个 ORMLite example project它使用 Activity 并管理自己的助手。

您的 DBHelper 类很好,但实际上您不需要 DataAccess 类。在您的每项 Activity (或服务...)中,您都需要具备以下内容:

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 类型的类来集中处理辅助类,那么您需要将这些方法设为静态并进行您自己的使用计数器。如果有多个 Activity 和后台任务调用 getHelper() 那么问题是什么时候调用 releaseHelper()?您必须为每次获取增加一个计数,并且只在计数器回到 0 时才调用释放。但即便如此,我也不能 100% 确定您会从 Activity 类中节省多少行。

关于java - 不使用基本 Activity 的 Ormlite 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7656539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com