Android数据库框架设计一

前言

Android开发中我们或多或少都会接触到数据库。Android中提供了一个占用内存极小的关系型数据库-SQLite。虽然Android系

统中提供了许多操作SQLite的API,但是我们还是需要手动去编写SQL语句,这经常会出现一些莫名其妙的问题。所以便出现了

许多ORM(对象关系映射)框架。其中比较著名的有GreenDao、OrmLite、Litepal等。


    常用的数据框架:

数据库框架访问地址
GreenDao点击打开链接
OrmLite点击打开链接
Litepal点击打开链接


基于自己对框架的理解:


1.创建注解




注解的解释
annotatio作用
DbField用来控制创建数据库列表的字段
DbTable用来控制数据库表名
  

 
@Target(ElementType.TYPE)    //申明类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)   //申明属性



2.创建bean及数据库表







代码
@DbTable("tb_student")
public class Student {
    @DbField("_id")
    private Integer id;
    private String age;
    private String sex;
    private String hight;

    public Student(String age, String sex, String hight) {
        this.age = age;
        this.sex = sex;
        this.hight = hight;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getHight() {
        return hight;
    }

    public void setHight(String hight) {
        this.hight = hight;
    }
}



/**
 * 规范所有的数据库操作
 */

public interface IBaseDao<T> {
    /**
     * 插入数据
     * @param entity
     * @return
     */
    long insert(T entity);

    /**
     * 更新数据
     * @param entity
     * @param where
     * @return
     */
    long update(T entity,T where);

    /**
     *删除数据
     * @param where
     * @return
     */
    int delete(T where);

    /**
     * 查询数据
     * @param where
     * @return
     */
    List<T> query(T where);
    List<T> query(T where,String orderBy,Integer startIndex,Integer limit);
    List<T> query(String sql);
}



/**
 * @author :created by ${yangpf}
 * 时间:2018/6/8 19
 * 邮箱:xxx@.qq.com
 * 创建数据库表
 */
public class BaseDao<T> implements IBaseDao<T> {

    /**
     * 持有数据库操作的引用
     */
    private SQLiteDatabase sqLiteDatabase;
    /**
     * 表名
     */
    private String tableName;
    /**
     * 持有操作数据库所对应的java类型
     */
    private Class<T> entityClass;
    /**
     * 标识:用来表示是否做过初始化操作
     */
    private boolean isInit=false;
    /**
     * 定义一个缓存空间(key-字段名    value-成员变量)
     */
    private HashMap<String ,Field> cacheMap;


    /**
     *
     * @param sqLiteDatabase
     * @param entityClass
     * @return
     */
    protected boolean init(SQLiteDatabase sqLiteDatabase, Class<T> entityClass) {
        this.sqLiteDatabase = sqLiteDatabase;
        this.entityClass = entityClass;
        //可以根据传入的entityClass类型来建立表,只需要建一次
        if(!isInit){
            //自动建表
            //取到表名
            if(entityClass.getAnnotation(DbTable.class)==null){
                //反射到类名
                tableName=entityClass.getSimpleName();
            }else{
                //取注解上的名字 tb_student
                tableName=entityClass.getAnnotation(DbTable.class).value();
            }
            if(!sqLiteDatabase.isOpen()){
                return false;
            }
            //执行建表操作
            //create table if not exists tb_student(_id integer,age varchar(20),sex varchar(20),hight varchar(20))
            //单独用个方法来生成create命令
            String createTableSql=getCreateTableSql();
            sqLiteDatabase.execSQL(createTableSql);
            cacheMap=new HashMap<>();
            initCacheMap();
            isInit=true;
        }

        return isInit;
    }




public class BaseDaoFactory {
    private static final BaseDaoFactory ourInstance = new BaseDaoFactory();

    public static BaseDaoFactory getOurInstance() {
        return ourInstance;
    }

    private SQLiteDatabase sqLiteDatabase;
    /**
     * 定义创建数据的路径
     * 建议写到SD卡中,好处,APP让删除了,下次再安装的时候,数据还在
     */
    private String sqliteDatabasePath;

    private BaseDaoFactory() {
        //可以先判断有没有SD卡
        sqliteDatabasePath = "data/data/com.retrofit.androidsqlliteutils/test.db";
        sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(sqliteDatabasePath, null);
    }

    /**
     * 用来生产basedao对象
     */
    public <T> BaseDao<T> getBaseDao(Class<T> entityClass) {
        BaseDao baseDao = null;
        try {
            baseDao = BaseDao.class.newInstance();
            baseDao.init(sqLiteDatabase, entityClass);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return baseDao;
    }
}


检查是否成功
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.setContentView(R.layout.activity_main);

    initView();
}

@Override
public void onClick(View view) {
    if (view.getId() == R.id.vt_insertData) {

        BaseDao baseDao = BaseDaoFactory.getOurInstance().getBaseDao(Student.class);
        baseDao.insert(new Student("18", "男", "1.8米"));
    }
}

private void initView() {
    vtInsertData = (TextView) findViewById(R.id.vt_insertData);
    vtInsertData.setOnClickListener(MainActivity.this);
    Toast.makeText(this,"添加成功",Toast.LENGTH_LONG).show();
}


检查结果:



 使用SQLite工具打开test.db




到此成功!!!   后续补充


源码下载点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值