您的位置:首页 > 数据库

建设自己的数据库代码框架 --摘自肖老师博客160304

2016-03-25 00:00 381 查看
摘要: 当对一门技术的入门知识都掌握的差不多了,常用的一些api已经很熟识之后,如果想提升你的代码质量,就必然需要引入一些设计模式的思想,或者是java中的面向对象思想,而面向对象中最重要的就是抽象类以及接口,这两个东西虽然学过java的人都认识,但是要真正用好并且深入理解的,如果没有经过一段时间的知识以及代码的积累很难体会

原文地址: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


到此,本次数据库的封装就结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内部类 greenDAO