android 中应用程序项目和内部数据库库之间的循环依赖
circular dependency between app project and internal db library in android
我在从 andriod 代码访问我的数据库层时遇到了一种情况。我有我的应用程序项目和数据库,我创建了一个内部库来处理数据库操作。
我有一个从数据库层暴露的接口,它是由数据库库中的数据库管理器class实现的。
该接口有插入、select等常用SQL操作相关的方法
现在,当我调用其中一种方法将我的数据从应用程序传递到数据库库时,我想对对象执行此操作。在我的例子中,我有一个共同的基础 class,所有模型 class 都是从中继承的。
但是,当我尝试在我的数据库接口中添加一个将此基础对象作为参数的方法时,android studio 抱怨循环依赖。
目前,我可能会使用 Map 或其他一些数据结构来向我的数据库库发送数据以及从我的数据库库接收数据。但是,我想以标准方式解决这个问题。
我知道我必须做一些与依赖倒置原则相关的事情,但我只是没有得到关于如何通过使用抽象来使我的耦合松散的提示。
有人可以给一些提示以继续前进吗?
接口:
public interface DbItf {
public void close();
//For country table
public Map<String,String> selectCtrs(Context m_context, String qry);
long saveCtrList(Map<String, String> ctrMp, String qry, Context appContext);
}
相反,我想这样做:
public interface DbItf {
public void close();
//For country table
public List<MyObject> selectCtrs(Context m_context, String qry);
long saveCtrList(List<MyObject>, String qry, Context appContext);
}
我的应用程序项目模型 classes 通过以下方式访问此接口:
@Override
public long saveToLocal(String qry) {
AppCtrl.getInstance().initDB();
long retc = 0;
retc = AppCtrl.getInstance().getQeeDbItf().saveCtrList(AppCtrl.getInstance().getCtrMp(), qry, AppCtrl.getInstance().getAppContext());
return retc;
}
@Override
public void openFrmLocal(String qry) {
AppCtrl.getInstance().initDB();
Map<String,String> locMp = AppCtrl.getInstance().getQeeDbItf().selectCtrs(AppCtrl.getInstance().getAppContext(), qry);
if (locMp.size() > 0 ) {
Log.d("openFrmLocal", "" + String.valueOf(locMp.size()));
AppCtrl.getInstance().setCtrMp(locMp);
}
}
谢谢
希望能理解你的问题/系统架构。
不管怎样,只要定义一个DataBaseObject接口,由你将写入数据库的对象实现,并被数据库使用。
这样,您可以从两个 classes/libraries 导入接口,但只有 DataBaseObject 将直接指向数据库,反之亦然。
我在从 andriod 代码访问我的数据库层时遇到了一种情况。我有我的应用程序项目和数据库,我创建了一个内部库来处理数据库操作。
我有一个从数据库层暴露的接口,它是由数据库库中的数据库管理器class实现的。
该接口有插入、select等常用SQL操作相关的方法
现在,当我调用其中一种方法将我的数据从应用程序传递到数据库库时,我想对对象执行此操作。在我的例子中,我有一个共同的基础 class,所有模型 class 都是从中继承的。
但是,当我尝试在我的数据库接口中添加一个将此基础对象作为参数的方法时,android studio 抱怨循环依赖。
目前,我可能会使用 Map 或其他一些数据结构来向我的数据库库发送数据以及从我的数据库库接收数据。但是,我想以标准方式解决这个问题。
我知道我必须做一些与依赖倒置原则相关的事情,但我只是没有得到关于如何通过使用抽象来使我的耦合松散的提示。
有人可以给一些提示以继续前进吗?
接口:
public interface DbItf {
public void close();
//For country table
public Map<String,String> selectCtrs(Context m_context, String qry);
long saveCtrList(Map<String, String> ctrMp, String qry, Context appContext);
}
相反,我想这样做:
public interface DbItf {
public void close();
//For country table
public List<MyObject> selectCtrs(Context m_context, String qry);
long saveCtrList(List<MyObject>, String qry, Context appContext);
}
我的应用程序项目模型 classes 通过以下方式访问此接口:
@Override
public long saveToLocal(String qry) {
AppCtrl.getInstance().initDB();
long retc = 0;
retc = AppCtrl.getInstance().getQeeDbItf().saveCtrList(AppCtrl.getInstance().getCtrMp(), qry, AppCtrl.getInstance().getAppContext());
return retc;
}
@Override
public void openFrmLocal(String qry) {
AppCtrl.getInstance().initDB();
Map<String,String> locMp = AppCtrl.getInstance().getQeeDbItf().selectCtrs(AppCtrl.getInstance().getAppContext(), qry);
if (locMp.size() > 0 ) {
Log.d("openFrmLocal", "" + String.valueOf(locMp.size()));
AppCtrl.getInstance().setCtrMp(locMp);
}
}
谢谢
希望能理解你的问题/系统架构。
不管怎样,只要定义一个DataBaseObject接口,由你将写入数据库的对象实现,并被数据库使用。
这样,您可以从两个 classes/libraries 导入接口,但只有 DataBaseObject 将直接指向数据库,反之亦然。