OpenHelperManager: - 在OpenHelperManager中使用多个辅助类时设置新的辅助类ORMLite android

时间:2016-11-21 10:57:32

标签: java android design-patterns optimization ormlite

我在Android项目上使用ORMLite框架,并且在多个OpenHelperManager.getHelper()类上使用repo时遇到困难。

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

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;
    }
}

运行时效果很好。但是,当我尝试访问扩展repository的其他DatabaseHelper类时,例如使用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 个答案:

答案 0 :(得分:0)

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 static menber:

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

所以当你想要另一个类的getHelper时,如下所示:

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);