java OpenHelperManager:在OpenHelperManager或MLite 安卓中使用多个帮助器类时设置新的帮助器类
我在一个安卓项目上使用ORMLite
框架,在多个repo
类上使用OpenHelperManager.getHelper()
时,我被卡住了
以下是我的代码结构简介:-
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;
}
}
当我运行它时,它工作正常。但是,当我尝试访问另一个扩展了DatabaseHelper
的repository
类,并使用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 楼答案
releasetHelper方法未重置helperClass静态菜单:
因此,当您想要获取另一个类的Helper时,如下所示:
因此,即使您以前的helperclass('helperclass')也是您后来的helperclass('openHelperClass')的父类,但仍然不相等。这就是你看到的例外的原因
我的建议是打电话
OpenHelperManager.setOpenHelperClass(CategoryRepo.class);
以前
CategoryRepo categoryRepo = OpenHelperManager.getHelper(activity, CategoryRepo.class);