前言
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
到此成功!!! 后续补充
源码下载点击打开链接