在进行项目开发时,免不了要实现存储功能,也就是我们常说的数据持久化,我们知道,android五种存储方式,网络存储,数据库存储,文件存储,SharePreference和contentprovider,其中数据库存储是比较常用的一种方式,但是android提供的原生的sqlite用起来比较麻烦,还需要自己进行封装,所以今天就来讲一讲greendao;
greenDAO是一种Android数据库ORM(object/relational mapping)框架,与OrmLite、ActiveOrm、LitePal等数据库相比,单位时间内可以插入、更新和查询更多的数据,而且提供了大量的灵活通用接口。
1.使用方法:
(1)配置环境(Android Studio):
(A)首先将工程目录下的build.gradle文件配置成
buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
主要是在repositories加入mavenCentral(),再在dependencies中加入依赖;
(B)再将app目录下的build.gradle的文件配置成
先加入greendao的插件:
apply plugin: 'com.android.application' apply plugin: 'org.greenrobot.greendao'
再加入依赖
compile'org.greenrobot:greendao-generator:3.1.0'
最后再在android下配置
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } greendao{ schemaVersion 1 daoPackage'com.example.mytest.greendao.gen' targetGenDir'src/main/java' }schemaVersion---->指定数据库schema版本号,迁移等操作会用到
daoPackage-------->通过gradle插件生成的数据库相关文件,这里我设置的文件路径是com.example.anonymous.greendao
targetGenDir-------->这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而 不是build中,这样就不用额外的设置资源目录了
配置好这些之后,同步一下;
接下来就是代码的编写了:
首先编写实体类
@Entity public class User { @Id private String id; private String name; }
这时点击makeProject,文件目录就会发生变化;
首先User类会自动生成get,set方法
@Entity public class User { @Id private String id; private String name; @Generated(hash = 1037321026) public User(String id, String name) { this.id = id; this.name = name; } @Generated(hash = 586692638) public User() { } public String getId() { return this.id; } public void setId(String id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } }
然后会在你之前配置的targetgenDir目录下,生成DaoMaster,DaoSession和UserDao;
DaoManager是我自己封装的工具类,这里的DaoMaster是数据库的“管家”,主要功能是负责数据库的创建和删除,并将数据库存储到Session缓存中,DaoSession提供了方便的方法去让你操作数据库,并且是数据库的session的缓存,UserDao是根据User实体类来生成的对实体类的操作的具体实现类;
有了这些类,我们就可以方便的去操作数据库了;
(2)具体操作:
首先编写一个dao的管理类,初始化数据库,获取相应的操作对象
public class DaoManager { private static DaoManager mInstance; private DaoMaster daoMaster; private DaoSession daoSession; private DaoManager(){ DaoMaster.DevOpenHelper devOpenHelper=new DaoMaster.DevOpenHelper(MyApplication.getContext(),"my_db",null); daoMaster=new DaoMaster(devOpenHelper.getWritableDatabase()); daoSession=daoMaster.newSession(); } public DaoMaster getDaoMaster(){ return daoMaster; } public DaoSession getDaoSession(){ return daoSession; } public static DaoManager getmInstance(){ if (mInstance==null){ mInstance=new DaoManager(); } return mInstance; } }
再编写实体类的管理类,对数据库表的初始化,获取实体类的操作对象
public class EntityManager { private static EntityManager manager; private UserDao userDao; public UserDao getUserDao(){ return DaoManager.getmInstance().getDaoSession().getUserDao(); } public static EntityManager getManager(){ if (manager==null){ manager=new EntityManager(); } return manager; } }
代码测试:增删改查
//增加 private void insertData() { userDao.insert(new User("001","pgg")); } //删除 private void deleteData() { User pgg = userDao.queryBuilder().where(UserDao.Properties.Name.eq("pgg")).build().unique(); if (pgg!=null){ userDao.deleteByKey(pgg.getId()); } } //更新 private void updateData() { User pgg = userDao.queryBuilder().where(UserDao.Properties.Name.eq("pgg")).build().unique(); if (pgg!=null){ pgg.setName("pggpg"); userDao.update(pgg); Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(MyApplication.getContext(), "修改失败", Toast.LENGTH_SHORT).show(); } } //查找 private void queryData() { User load = userDao.load("001"); tv_id.setText("id="+load.getId()); tv_name.setText("name="+load.getName()); }
这里只不过使用了greendao的几种方法,增删改查还有很多的方法,需要的可以在官网上查询;
2.源码分析
greendao的源码我准备从他的四个核心类去分析,DaoMaster,DaoSession,XXXDao,XXXEntity;
(1)DaoMaster:DaoMaster是GreenDao框架管理类,该类对数据库相关管理操作进行封装