我正在使用DAO模式实现Android应用程序。从阅读中我已经了解了一些原则(比如关于多个数据源的优点)我并不是100%确定我的实现检查了模式的所有主要目标(例如:实现隐藏)。
如果我们需要从视图中完全隐藏实现细节,并且因为我当前正在将应用程序上下文传递给TeamItemDataSource.java的构造函数,我认为这应该重新编写并且我有两个解决方案:其中一个问题我目前正在考虑从TeamIteamDataSource.java扩展SQLiteOpenHelper,但我认为我会遇到麻烦,因为我已经有一个类可以完成这项工作(我将不得不从SQLiteOpenHelper扩展更多的对象)。另一方面,我总是可以传递应用程序上下文,在工厂方法中,我只是调用一个未使用应用程序上下文的潜在未来类的构造函数。
关于实施隐藏的最后一个问题(我假设我对这个概念可能是错的 - 如果是这样我会很感激解释): 在访问数据库的类(TeamItemDataSource.java)中隐藏实现细节的方法是使用包含sql语句的私有或受保护字符串?因为如果所有方法都是公开的,我没有隐藏任何东西。
对于我的应用程序的一个对象(关于足球(非美国的))我有这些课程:
TeamItemDAOFactory.java
public class TeamItemDAOFactory {
private final static int SQLite = 1;
public static TeamItemDAO getTeamItemDAO(Context ctx, int activeDB) {
TeamItemDAO teamItemDAO;
switch(activeDB) {
case SQLite:
teamItemDAO = new TeamItemDataSource(ctx);
return teamItemDAO;
default:
return null;
}
}
}
TeamItemDAO.java
public interface TeamItemDAO {
public ArrayList<TeamItem> getAllTeamsByRanking();
public void populateDBfromJSON(JSONArray jsonInput) throws SQLiteException;
public void insertTeam(TeamItem teamItem) throws SQLiteException;
public void updateTeam(TeamItem teamItem);
public void deleteTeams();
}
TeamItemDataSource.java
public class TeamItemDataSource implements TeamItemDAO {
private SQLiteDatabase database;
private CIFDBHelper dbHelper;
private String[] allColumns = { CIFDBHelper.COLUMN_EQUIPA,
CIFDBHelper.COLUMN_VITORIAS, CIFDBHelper.COLUMN_EMPATES,
CIFDBHelper.COLUMN_DERROTAS, CIFDBHelper.COLUMN_PONTOS,
CIFDBHelper.COLUMN_JOGOS, CIFDBHelper.COLUMN_LUGAR };
private String TAG = "TeamItemDataSource";
public TeamItemDataSource(Context context) {
dbHelper = CIFDBHelper.getInstance(context);
}
private void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
public ArrayList<TeamItem> getAllTeamsByRanking() {
//
}
public void populateDBfromJSON(JSONArray jsonInput) throws SQLiteException {
//
}
public void insertTeam(TeamItem teamItem) throws SQLiteException{
//
}
public void updateTeam(TeamItem teamItem) {
//
}
public void deleteTeams() {
//
}
private TeamItem cursorToTeam(Cursor cursor) {
//
}
}