有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java OpenHelperManager:在OpenHelperManager或MLite 安卓中使用多个帮助器类时设置新的帮助器类

我在一个安卓项目上使用ORMLite框架,在多个repo类上使用OpenHelperManager.getHelper()时,我被卡住了

以下是我的代码结构简介:-

DatabaseHelper类,该类负责创建databasetables

public class DatabaseHelper extends OrmLiteSqliteOpenHelper{

    public static String DATABASE_NAME = "muffet.db";
    public static int DATABASE_VERSION = 5;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config);
    }

    @Override
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
        // Creating tables
        try {
            TableUtils.createTable(connectionSource, Category.class);
            TableUtils.createTable(connectionSource, Transaction.class);
            TableUtils.createTable(connectionSource, Budget.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        try {
            TableUtils.dropTable(connectionSource, Category.class, true);
            TableUtils.dropTable(connectionSource, Transaction.class, true);
            TableUtils.dropTable(connectionSource, Budget.class, true);
            onCreate(database, connectionSource);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

}

TransactionRepo负责访问数据库

public class TransactionRepo extends DatabaseHelper {
    //    private Dao<Transaction, Integer> transactionDao = null;
    private RuntimeExceptionDao<Transaction, Integer> transactionRuntimeDao = null;

    public TransactionRepo(Context context) {
        super(context);
    }

    public RuntimeExceptionDao<Transaction, Integer> getTransactionRuntimeDao(){
        if(transactionRuntimeDao == null){
            transactionRuntimeDao = getRuntimeExceptionDao(Transaction.class);
        }
        return transactionRuntimeDao;
    }

    /**
     * Save Transaction to database
     */
    public void save(Transaction transaction){
        try {
            transactionRuntimeDao = getTransactionRuntimeDao();
            transactionRuntimeDao.createOrUpdate(transaction);
        }catch(Exception e){
            e.printStackTrace();
        }

    }

    /**
     * Get all list of data
     */
    public List<Transaction> getAll(){
        try{
            transactionRuntimeDao = getTransactionRuntimeDao();
            return transactionRuntimeDao.queryForAll();
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

TransactionServiceImpl这是一个用于从TransactionRepo获取数据的服务类

public class TransactionServiceImpl implements TransactionService {

    TransactionRepo transactionRepo;

    @Override
    public void save(Transaction transaction, Activity activity) {


        transactionRepo = OpenHelperManager.getHelper(activity, TransactionRepo.class);
        transactionRepo.save(transaction);
        OpenHelperManager.releaseHelper();
    }

    @Override
    public List<Transaction> getAll(Activity activity) {

        transactionRepo = OpenHelperManager.getHelper(activity, TransactionRepo.class);

        List<Transaction> transactionList = transactionRepo.getAll();

        OpenHelperManager.releaseHelper();

        return transactionList;
    }
}

当我运行它时,它工作正常。但是,当我尝试访问另一个扩展了DatabaseHelperrepository类,并使用OpenHelperManager.getHelper()例如:-

CategoryRepo categoryRepo = OpenHelperManager.getHelper(activity, CategoryRepo.class);

我得到的错误是java.lang.IllegalStateException: Helper class was class com.muffet.persistence.repository.TransactionRepo but is trying to be reset to class com.muffet.persistence.repository.CategoryRepo

这显然意味着OpenHelperManager已保存了TransactionRepo的实例,当我尝试获取并将其设置为CategoryRepo时,它无法强制转换或类似的操作

我如何解决这个问题

多谢各位


共 (1) 个答案

  1. # 1 楼答案

    public static synchronized void releaseHelper() {
        instanceCount ;
        logger.trace("releasing helper {}, instance count = {}", helper, instanceCount);
        if (instanceCount <= 0) {
            if (helper != null) {
                logger.trace("zero instances, closing helper {}", helper);
                helper.close();
                helper = null;
                wasClosed = true;
            }
            if (instanceCount < 0) {
                logger.error("too many calls to release helper, instance count = {}", instanceCount);
            }
        }
    }
    

    releasetHelper方法未重置helperClass静态菜单:

    private static Class<? extends OrmLiteSqliteOpenHelper> helperClass = null;
    

    因此,当您想要获取另一个类的Helper时,如下所示:

    private static void innerSetHelperClass(Class<? extends OrmLiteSqliteOpenHelper> openHelperClass) {
        // make sure if that there are not 2 helper classes in an application
        if (openHelperClass == null) {
            throw new IllegalStateException("Helper class was trying to be reset to null");
        } else if (helperClass == null) {
            helperClass = openHelperClass;
        } else if (helperClass != openHelperClass) {
            throw new IllegalStateException("Helper class was " + helperClass + " but is trying to be reset to "
                    + openHelperClass);
        }
    }
    

    因此,即使您以前的helperclass('helperclass')也是您后来的helperclass('openHelperClass')的父类,但仍然不相等。这就是你看到的例外的原因

    我的建议是打电话

    OpenHelperManager.setOpenHelperClass(CategoryRepo.class);

    以前

    CategoryRepo categoryRepo = OpenHelperManager.getHelper(activity, CategoryRepo.class);