我在Android项目上使用ORMLite
框架,并且在多个OpenHelperManager.getHelper()
类上使用repo
时遇到困难。
以下是我的代码结构简介: -
DatabaseHelper
类,负责创建database
和tables
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
时,它无法投射或类似的内容。
我该如何解决这个问题?
谢谢
答案 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);