Android数据库设计——1,面向对象(ORM)建库、建表

创建数据库

创建一个数据库工厂类,用于创建数据库操作对象和表的Dao对象

//数据库工厂类
public class BaseDaoFactory {
    //该对象是单例的
    private static final BaseDaoFactory instance = new BaseDaoFactory();

    //数据库对象
    private SQLiteDatabase sqLiteDatabase;

    //定义建数据库的路径
    //路径可以写在data/data下,优点是数据保密;缺点是app卸载数据丢失
    //写在sd卡中,优点是app卸载数据不会丢失;缺点是数据缺乏保密性
    private String sqliteDatabasePath;
	
    //单例
    public static BaseDaoFactory getInstance() {
        return instance;
    }
	//构造方法
    public BaseDaoFactory() {
        //新建数据库
//        Environment.getExternalStorageDirectory()+ File.separator;
        //写在data/data路径下
        sqliteDatabasePath = "data/data/com.xxx.greendao/test_1.db";
        //创建数据库操作对象
        sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(sqliteDatabasePath, null);
    }

创建表

定义一个创建和操作的Dao的接口(面向接口编程)

public interface IBaseDao<T> {
    //插入
    long insert(T entity);

    //更新
    long update(T entity,T where);

    //删除
    int delete(T where);

    //查询全部
    List<T> queryAll();

    //条件查询
    List<T> queryByWhere(T where);

    //条件查询,排序,分页
    List<T> queryByWhere(T where,String orderBy,int startIndex,int limit);
}

实现Dao接口

//每一张表都有与之对应的Dao类,而所有的具体对象的Dao都要继承该BaseDao
public class BaseDao<T> implements IBaseDao<T> {

    //数据库对象
    private SQLiteDatabase sqLiteDatabase;

    //表名,当前dao所对应的表
    private String tableName;

    //持有操作数据库所对应的javaBean类型
    private Class<T> entityClass;

    //是否已经初始化
    private boolean isInit;

    //架构内部的逻辑不要提供构造方法给调用层使用,表名靠反射来获得
    public void init(SQLiteDatabase sqLiteDatabase, Class<T> entityClass) {
        //保存对象
        this.sqLiteDatabase = sqLiteDatabase;
        this.entityClass = entityClass;
        //是否已经初始化,防止同一个表的Dao对象多次实例化
        if (!isInit) {
            //自动建表
            //通过反射和注解获得表名,如果没有添加注解,则通过反射去拿表名
            DbTable dbTable = entityClass.getAnnotation(DbTable.class);
            if (dbTable != null) {
                //注解拿表名
                this.tableName = dbTable.value();
            } else {
                //反射拿表名
                this.tableName = entityClass.getSimpleName();
            }
            //创建表的sql语句
            String createTableSql = getCreateTableSql();
            //执行sql
            this.sqLiteDatabase.execSQL(createTableSql);
            isInit = true;
        }
    }
}

getCreateTableSql()

public class BaseDao<T> implements IBaseDao<T> {
    //...其他代码
    
	//创建表的sql
	private String getCreateTableSql() {
	    StringBuilder stringBuilder = new StringBuilder();
        //拼接创建表的sql语句
	    stringBuilder.append("create table if not exists ");
	    stringBuilder.append(tableName).append("(");
	    //反射得到所有的成员变量
	    Field[] fields = entityClass.getDeclaredFields();
	    for (Field field : fields) {
            //拿到成员的类型
	        Class type = field.getType();
	        //拿到成员的值
            String fieldName;
	        if (field.getAnnotation(DbField.class) != null) {
	            //有注解
	            fieldName = field.getAnnotation(DbField.class).value();
	        } else {
	            //通过反射
	            fieldName = field.getName();
	        }
            //拼接类型对应的sql
	        if (type == String.class) {
	            stringBuilder.append(fieldName).append(" varchat,");
	        } else if (type == Integer.class) {
	            stringBuilder.append(fieldName).append(" INTEGER,");
	        } else if (type == Long.class) {
	            stringBuilder.append(fieldName).append(" BIGINT,");
	        } else if (type == Double.class) {
	            stringBuilder.append(fieldName).append(" DOUBLE,");
	        } else if (type == Float.class) {
	            stringBuilder.append(fieldName).append(" FLOAT,");
	        } else if (type == byte[].class) {
	            stringBuilder.append(fieldName).append(" BLOB,");
	        }
	    }
	    //去掉结尾的,号
	    if (stringBuilder.charAt(stringBuilder.length() - 1) == ',') {
	        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
	    }
        //sql拼接结束
	    stringBuilder.append(")");
	    //返回创建表的sql语句
        return stringBuilder.toString();
	}
}
发布了113 篇原创文章 · 获赞 48 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/yehui928186846/article/details/102807596