当前位置: 首页 > 面试题库 >

不使用基本活动的Ormlite设置

虞正业
2023-03-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如果尚未创建)。

有人可以告诉我这是对是错,还是我走对了路?

谢谢!


问题答案:

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

您的路线正确,但@Matt有点偏离。坦白说,如果没有扩展我们的基类,我从来没有做过一个项目。但这是一个很好的练习,因此我创建了这个ORMLite示例项目,该项目使用an
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类型类来集中处理helper类,那么您将需要使这些方法静态化并做自己的使用计数器。如果有多个活动和后台任务在呼叫,getHelper()那么问题是您何时呼叫releaseHelper()?您必须为每个get计数增加一个计数,并且只有在计数器回到0时才释放该计数。但是即使如此,我仍然不确定100%可以从活动类中节省多少行。



 类似资料:
  • 我正在为导航构建一个基本活动,并希望有一些灵活的活动,这样活动就可以向基本活动指定要膨胀的布局。 有没有更好的方法实现这一点?也许用一个内容框架设置一个基本布局,然后膨胀到那个? 如有任何建议,将不胜感激。

  • 无法启动活动ComponentInfo{com.app.mobile.android.dev/com.app.mobile.android.splashscreen}:java.lang.IllegalArgumentException:没有为类绑定的注入器工厂。注入器工厂被绑定为com.delta.mobile.android.splashScreen:[com.app.mobile.andro

  • 我只是开始尝试在我非常简单的项目上使用Hilt。现在它都是在Dagger2上,但我想迁移到Hilt。 我有一个活动: 和下面这样的基本活动: 或者(就像我用匕首那样): 另外,我只是一个初学者,所以,也许我错过了什么。我将继续搜索:) 感谢您的时间和回答:) java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“Android.content.pm.Appli

  • 我试图遵循这个答案,其主要思想是覆盖中的,该活动将由所有活动扩展,因此只有将具有导航抽屉。 然而,在我尝试实现答案后,我的导航从未显示(即使在)。我就是这么做的: 这是导航抽屉的xml: 这是我重写的(在中): 这是我在上的,注意我使用的是而不是: 最后,我只需要像往常一样扩展类和代码。 更新 根据答案,这是我的工作覆盖:

  • 问题内容: 我在AngularJS中设置了这样的路由: 我在顶部栏上有一些链接的标签样式。如何根据当前模板或URL将“活动”类添加到选项卡? 问题答案: 一种无需依赖URL即可解决此问题的方法是在配置过程中向每个部分添加自定义属性,如下所示: 在您的控制器中公开: 根据当前活动选项卡设置类:

  • 我是Kafka的初来乍到,有一些基本的怀疑。我试着做一个Kafka建立的多节点(主动-主动)。情况如下:- 运行单个zookeeper(端口:2181) 创办了三家Kafka经纪人(9092、9093、9094) 创建单个主题测试(分区:1,复制3) 使用代理列表启动生产者(9092,9093) 在9092、9093、9094上启动了使用者,但它们都在使用相同的主题。 现在我怀疑的是,当我从生产者