在android studio中使用greenDao
2016-03-02 17:15
459 查看
最近项目重构,我负责android客户端数据库操作的封装,调研时发现了一款超级好用的ORM数据库框架——greenDao!
看了greenDao官网的说明,发现这个框架比之前用的ORMLite快很多,采用自动生成代码的方式也让人眼前一亮,于是决定试一试。
好了,话不多说,上代码!
2、为工程添加一个java的module,命名为daogenerator,此工程只有一个类MyDaoGenerator.
3、在app的build.gradle中添加以下代码
在daogenerator的build.gradle中添加以下代码
配置好gradle后,同步(sync )一下.
同步结束后开始下一步.
引用古沐风的一段文字说明一下这些自动生成的代码什么意思:
(古沐风博客:/article/3572426.html)
DaoMaster:一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase对象以及操作DAO classes(注意:不是对象)。其提供了一些创建和删除table的静态方法,其内部类OpenHelper和DevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。
DaoSession:会话层。操作具体的DAO对象(注意:是对象),比如各种getter方法。
XXXDao:实际生成的某某DAO类,通常对应具体的java类,比如NoteDao等。其有更多的权限和方法来操作数据库元素。
XXXEntity:持久的实体对象。通常代表了一个数据库row的标准java properties。
现在我需要一个userInfo的表,我需要在MyDaoGenerator做以下的工作.
运行MyDaoGenerator,如果出现以下结果,就表示你配置成功,马上就可以任性的用greenDao操作数据库了.
再看一眼java-gen-db下自动生成的代码
在Application中init后我们就能在工程里任意获取DaoSession,然后对数据库操作了。
1.要注意在数据库升级的时候,greenDao会删除所有旧数据.因此这里得自己重写DaoMaster.OpenHelper的onUpgrade方法处理一下.
MyDevOpenHelper继承DaoMaster.OpenHelper,重写onUpgrade方法。
2.每个表要用一个DaoHelper来操作。比如我要操作UserInfo表,就得有个UserInfoDaoHelper类.
常用的数据库操作可以定义成接口DaoHelperInterface
UserInfoDaoHelper实现了DaoHelperInterface中的方法
第一篇博客,有错麻烦指正,不喜亲喷.
看了greenDao官网的说明,发现这个框架比之前用的ORMLite快很多,采用自动生成代码的方式也让人眼前一亮,于是决定试一试。
好了,话不多说,上代码!
一、配置工程
1、在../app/src/main 目录下新建Directory命名为java-gen-db,用于存放greenDao自动生成的代码.2、为工程添加一个java的module,命名为daogenerator,此工程只有一个类MyDaoGenerator.
3、在app的build.gradle中添加以下代码
sourceSets{ main{ java.srcDirs = ['src/main/java','src/main/java-gen-db'] } }
compile 'de.greenrobot:greendao:2.1.0'
在daogenerator的build.gradle中添加以下代码
compile 'de.greenrobot:greendao-generator:2.1.0'
配置好gradle后,同步(sync )一下.
同步结束后开始下一步.
二、生成代码
daogenerator的作用是生成geenDao操作数据库的DaoMaster、DaoSession,GreenDao和JavaBean。引用古沐风的一段文字说明一下这些自动生成的代码什么意思:
(古沐风博客:/article/3572426.html)
DaoMaster:一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase对象以及操作DAO classes(注意:不是对象)。其提供了一些创建和删除table的静态方法,其内部类OpenHelper和DevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。
DaoSession:会话层。操作具体的DAO对象(注意:是对象),比如各种getter方法。
XXXDao:实际生成的某某DAO类,通常对应具体的java类,比如NoteDao等。其有更多的权限和方法来操作数据库元素。
XXXEntity:持久的实体对象。通常代表了一个数据库row的标准java properties。
现在我需要一个userInfo的表,我需要在MyDaoGenerator做以下的工作.
/** * 此java工程用于生成 * greenDao操作数据库需要的 * DaoMaster && DaoSession && xxDao && xxEntity */ public class MyDaoGenerator { public static void main(String[] args) throws Exception{ //参数1:数据库版本 //参数2:自动生成代码默认包 Schema schema = new Schema(2,"org.xxx.db"); addUserInfo(schema); //获取自动输出代码路径 //避免团队合作时各人项目路径不同 String url = MyDaoGenerator.class.getResource("/").getFile().toString(); String[] str = url.split("daogenerator"); String outDir = str[0] + "app/src/main/java-gen-db"; System.out.println(outDir); new DaoGenerator().generateAll(schema,outDir); } /** * 用户信息表 * @param schema */ private static void addUserInfo(Schema schema){ Entity userInfo = schema.addEntity("UserInfo"); userInfo.addStringProperty("userAddress"); userInfo.addStringProperty("userBirthday"); userInfo.addStringProperty("userCapacity"); userInfo.addStringProperty("userClass"); userInfo.addStringProperty("userCollege"); userInfo.addStringProperty("userEducation"); userInfo.addStringProperty("userHeadLink"); userInfo.addStringProperty("userHometown"); userInfo.addStringProperty("userIdcard"); userInfo.addStringProperty("userMark"); userInfo.addStringProperty("userName"); userInfo.addStringProperty("userNickname"); userInfo.addStringProperty("userPassword"); userInfo.addStringProperty("userQQNumber"); userInfo.addStringProperty("userRegistTime"); userInfo.addStringProperty("userSign"); userInfo.addStringProperty("userSpecialty"); userInfo.addStringProperty("userStuId"); userInfo.addStringProperty("userTel"); userInfo.addIntProperty("userInfoVersion"); userInfo.addIntProperty("userSex"); userInfo.addIntProperty("userType"); } }
运行MyDaoGenerator,如果出现以下结果,就表示你配置成功,马上就可以任性的用greenDao操作数据库了.
再看一眼java-gen-db下自动生成的代码
三、android工程中初始化数据库
新建一个类DBLoader用于DaoSession的获取public class DBLoader { private static DaoMaster daoMaster = null; private static DaoSession daoSession = null; private static SQLiteDatabase db = null; public static void init(){ MyDevOpenHelper helper = new MyDevOpenHelper(BaseApplication.getInstance(),Constants.DB_NAME,null); db = helper.getWritableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); } public static DaoSession getDaoSession(){ if (daoSession==null){ init(); } return daoSession; } }
在Application中init后我们就能在工程里任意获取DaoSession,然后对数据库操作了。
public class BaseApplication extends android.app.Application { private static Context context; @Override public void onCreate() { super.onCreate(); context = getApplicationContext(); DBLoader.init(); } public static Context getInstance() { return context; } }
四、封装数据库操作
最后为了让greenDao在项目中更方便的使用,我们还要做一些工作。1.要注意在数据库升级的时候,greenDao会删除所有旧数据.因此这里得自己重写DaoMaster.OpenHelper的onUpgrade方法处理一下.
MyDevOpenHelper继承DaoMaster.OpenHelper,重写onUpgrade方法。
public class MyDevOpenHelper extends DaoMaster.OpenHelper { public MyDevOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory){ super(context,name,factory); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion){ case 1: //TODO //数据库升级时在此处理 //否则升级后数据库会清空 //创建新表 //UserInfoDao.createTable(db,true); //加入新字段 //db.execSQL("ALTER TABLE USER_INFO ADD RONG_TOKEN VARCHAR(50)"); break; default: break; } } }
2.每个表要用一个DaoHelper来操作。比如我要操作UserInfo表,就得有个UserInfoDaoHelper类.
常用的数据库操作可以定义成接口DaoHelperInterface
public interface DaoHelperInterface { public <T> void addData(T t); public <T> void deleteData(T t); public void deleteAll(); public <T> T getDataById(String id); public List getAllData(); public boolean hasKey(String id); public long getTotalCount(); }
UserInfoDaoHelper实现了DaoHelperInterface中的方法
public class UserInfoDaoHelper implements DaoHelperInterface{ private static UserInfoDaoHelper instance; private UserInfoDao userInfoDao; private UserInfoDaoHelper(){ try { userInfoDao = ISwustDBLoader.getDaoSession().getUserInfoDao(); }catch (Exception e){ e.printStackTrace(); } } public static UserInfoDaoHelper getInstance(){ if (instance == null){ instance = new UserInfoDaoHelper(); } return instance; } @Override public <T> void addData(T bean) { if(userInfoDao !=null && bean != null){ userInfoDao.insertOrReplace((UserInfo)bean); } } @Override public <T> void deleteData(T t) { } @Override public void deleteAll() { if (userInfoDao != null){ userInfoDao.deleteAll(); } } @Override public <T> T getDataById(String id) { return null; } @Override public List getAllData() { if (userInfoDao != null){ return userInfoDao.loadAll(); } return null; } @Override public boolean hasKey(String id) { return false; } @Override public long getTotalCount() { if (userInfoDao != null){ QueryBuilder<UserInfo> qb = userInfoDao.queryBuilder(); return qb.buildCount().count(); } return 0; } }
五、效果图
亲测有效不包邮哟!第一篇博客,有错麻烦指正,不喜亲喷.
相关文章推荐
- Android 5.0 Camera (2): 初始化
- Android java.lang.NoClassDefFoundError的一种解决方法
- 替换默认debug.keystore文件,替换debug.keystore
- Android系统服务详解-android学习之旅(95)
- Android系统服务详解-android学习之旅(95)
- Android系统服务详解-android学习之旅(95)
- Android系统服务详解-android学习之旅(95)
- 【Android】Service中判断当前是否全屏(状态栏是否隐藏)
- android应用框架理解
- android 退出应用最优雅的方式
- android 自定义checkbox
- Android中RxJava+Retrofit2.0+MVP模式的整合
- android开发那些事儿(四)--调用系统相机像素过低
- px、dp和sp这些单位有什么区别?
- Android自定义view
- Android游戏开发之游戏帧动画的播放与处理
- Android 使用ListView的A-Z字母排序功能实现联系人模块
- 如何解决Android开发中的【java.lang.unsatisfiedlinkerror findLibrary returned null.】 错误
- 基于Android 4.4 开发的多窗口系统 开放源码
- android 输入框等控件的移动