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

Posted 夜辉疾风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
	

以上是关于Android数据库设计——1,面向对象(ORM)建库建表的主要内容,如果未能解决你的问题,请参考以下文章

Android数据库设计——2,面向对象(ORM)操作表:增删改查

Android数据库设计——2,面向对象(ORM)操作表:增删改查

5 -- Hibernate的基本用法 --1 1 对象/关系数据库映射(ORM)

安卓中的数据库操作

orm的设计思路

Mybatis相关概念