原文地址:http://blog.csdn.net/xll712/article/details/50592114
书接上回
下面是三个类中的全代码:
public interface IDatabase<M,K> {
boolean insert(M m);
boolean add(M m);
List<M> loadAll(); /**
* 自定义查询
*
* @return
*/
QueryBuilder<M> getQueryBuilder(); /**
* @param where
* @param selectionArg
* @return
*/
List<M> queryRaw(String where, String... selectionArg);
boolean deleteAll();
AbstractDao<M, K> getAbstractDao();
}123456789101112131415161718192021
public abstract class DatabaseManager<M, K> implements IDatabase<M, K> { private static final String DEFAULT_DATABASE_NAME = "greendao.db"; /**
* The Android Activity reference for access to DatabaseManager.
*/
private DaoMaster.DevOpenHelper mHelper; private DaoSession daoSession; private SQLiteDatabase database; private DaoMaster daoMaster; protected Context context; protected String dbName; public DatabaseManager(Context context) { this.context = context;
dbName = DEFAULT_DATABASE_NAME;
getmHelper(context, dbName);
} public DatabaseManager(Context context, String dbName) { this.context = context; this.dbName = dbName;
getmHelper(context, dbName);
} public DaoMaster.DevOpenHelper getmHelper(Context context, String dbName) { if (null == mHelper) {
mHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
} return mHelper;
} protected void openWritableDb() {
getWritableDatabase();
getDaoMaster();
getDaoSession();
} protected SQLiteDatabase getWritableDatabase() {
database = getmHelper(context, dbName).getWritableDatabase(); return database;
} protected DaoMaster getDaoMaster() { if (null == daoMaster) {
daoMaster = new DaoMaster(getWritableDatabase());
} return daoMaster;
} protected DaoSession getDaoSession() { if (null == daoSession) {
daoSession = getDaoMaster().newSession();
} return daoSession;
} public void closeDbConnections() { if (null == mHelper) {
mHelper.close();
mHelper = null;
} if (null == daoSession) {
daoSession.clear();
daoSession = null;
}
} public void clearDaoSession() { if (null == daoSession) {
daoSession.clear();
daoSession = null;
}
}
@Override public boolean insert(M m) { if (null == m){ return false;
}
openWritableDb();
getAbstractDao().insert(m); return true;
}
@Override public boolean add(M m) { if (null == m){ return false;
}
openWritableDb();
getAbstractDao().insert(m); return true;
}
@Override public List<M> loadAll() {
openWritableDb(); return getAbstractDao().loadAll();
}
@Override public boolean deleteAll() {
openWritableDb();
getAbstractDao().deleteAll(); return false;
}
@Override public QueryBuilder<M> getQueryBuilder() {
openWritableDb(); return getAbstractDao().queryBuilder();
}
@Override public List<M> queryRaw(String where, String... selectionArg) {
openWritableDb(); return getAbstractDao().queryRaw(where,selectionArg);
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
public class PersonDatabaseManager extends
DatabaseManager<Person,Long> {
public PersonDatabaseManager(Context context) { super(context);
} public PersonDatabaseManager(Context context, String dbName) { super(context, dbName);
}
@Override public AbstractDao<Person, Long> getAbstractDao() { return getDaoSession().getPersonDao();
}
}1234567891011121314151617
public class StudentDatabaseManager extends DatabaseManager<Student,String> {
public StudentDatabaseManager(Context context) { super(context);
} public StudentDatabaseManager(Context context, String dbName) { super(context, dbName);
}
@Override public AbstractDao<Student, String> getAbstractDao() { return getDaoSession().getStudentDao();
}
}1234567891011121314
好,写到这里我们就该结束了吗?no,我们还可以继续,come on baby。
以上的PersonDatabaseManager、StudentDatabaseManager是否可以利用工厂模式来创建了?
答案当然是yes!
普通工厂模式:建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
这样的话就得出了我们下面的类:
public class DatabaseManagerFactory { public static DatabaseManager getDataManager(Context context, int type) { switch (type) { case 0: return new PersonDatabaseManager(context); case 1: return new StudentDatabaseManager(context);
} return null;
}
}12345678910111213
到此,本次数据库的封装就结束。