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)操作表:增删改查