应用数据库管理ORM框架---GreenDao的使用
2016-05-03 16:19
531 查看
1、greenDao介绍
移动开发的时候经常涉及到了数据库操作,通常我们会使用SQLiteOpenHelper定义数据库的操作,其中需要重写onCreate以及onUpgrade方法,创建相关的表格或者对数据库进行更新;之后还需要对数据库进行CRUD操作,如果将对象进行了封装操作,还需要进一步将查询结果封装到实体类中,显得特别的麻烦;而greenDao就是典型的一个ORM框架方便我们的使用。
2、使用步骤(使用框架自动生成相关的文件)
具体可以参考使用框架引入GreenDao;
当然我们也可以自己新建一个java模块以生成相关的Dao文件;
2.1 新建一个java module;在java module的gradle文件中添加
3、使用生成的文件创建数据库以及表
通过以下代码就可以在应用中创建相关的数据库文件:
4.1、查询
完整代码如下:
参考:在AndroidStudio中引入GreenDao
移动开发的时候经常涉及到了数据库操作,通常我们会使用SQLiteOpenHelper定义数据库的操作,其中需要重写onCreate以及onUpgrade方法,创建相关的表格或者对数据库进行更新;之后还需要对数据库进行CRUD操作,如果将对象进行了封装操作,还需要进一步将查询结果封装到实体类中,显得特别的麻烦;而greenDao就是典型的一个ORM框架方便我们的使用。
2、使用步骤(使用框架自动生成相关的文件)
具体可以参考使用框架引入GreenDao;
当然我们也可以自己新建一个java模块以生成相关的Dao文件;
2.1 新建一个java module;在java module的gradle文件中添加
compile('de.greenrobot:DaoGenerator:1.3.0')2.2 在java文件中实现main方法,在此方法中实现数据库以及表格的创建,相关代码如下:
package com.example; import de.greenrobot.daogenerator.DaoGenerator; import de.greenrobot.daogenerator.Entity; import de.greenrobot.daogenerator.Schema; public class Main { public static void main(String[] args) throws Exception { /** * 第一个参数表示数据库版本,只能++或者卸载 * 第二个参数表示默认生成相关文件的package */ Schema schema = new Schema(1, "db"); /** * 通过Schema实例创建相关的表格 */ initUserBean(schema); /** * 指定相关文件生成的路径 * 注意:new Schema(1, "db")的第二个参数也是默认package,相关文件的生成路径是:第二个参数 + "db" */ new DaoGenerator().generateAll(schema, "F:\\AndroidStudioWrokspace\\GreenDao\\app\\src\\main\\java\\com\\wrx"); } private static void initUserBean(Schema schema) { /** * 创建表格名称 */ Entity entry = schema.addEntity("User"); /** * 为表格添加相关属性 */ entry.addIdProperty(); entry.addStringProperty("name"); entry.addIntProperty("age"); } }main方法完成后,就可以执行该main函数,结果是会在执行的目录下生成相关的dao文件,其中包括一个DaoMaster、DaoSession、Bean以及BeanDao;
3、使用生成的文件创建数据库以及表
通过以下代码就可以在应用中创建相关的数据库文件:
DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(context, Contacts.DB_NAME, null); DaoMaster sDaoMaster = new DaoMaster(openHelper.getWritableDatabase()); DaoSession sDaoSession = sDaoMaster.newSession();如果需要对某个表进行相关的CRUD操作就可以通过DaoSession实例,获取相应得BeanDao,调用不同的方法执行不同的操作;当然,如果每个操作的地方都这样写,不能保证DaoMaster以及DaoSession的实例的唯一性,所以我们可以在Application中通过简单的单例模式控制他们的实例,当然也可以自己写一个类控制他们:
package greendao; import android.content.Context; /** * Created by Administrator on 2016/4/26. */ public class DaoHelper { private static DaoMaster sDaoMaster; private static DaoSession sDaoSession; public static synchronized DaoMaster getDaoMaster(Context context) { if (sDaoMaster == null) { DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(context, Contacts.DB_NAME, null); sDaoMaster = new DaoMaster(openHelper.getWritableDatabase()); } return sDaoMaster; } public static synchronized DaoSession getDaoSession(Context context) { if (sDaoSession == null) { if (sDaoMaster == null) { sDaoMaster = getDaoMaster(context); } sDaoSession = sDaoMaster.newSession(); } return sDaoSession; } public static void cleanDB() { sDaoMaster = null; sDaoSession = null; } }另外,如果你到Daomaster里面去看,会发现这里还有个问题:
DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(context, Contacts.DB_NAME, null);
/** WARNING: Drops all table on Upgrade! Use only during development. */ public static class DevOpenHelper extends OpenHelper { public DevOpenHelper(Context context, String name, CursorFactory factory) { super(context, name, factory); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); dropAllTables(db, true); onCreate(db); } }你会发现在数据库更新的时候,这里只是简单的先删除所有的表格,再重新新建;这就会导致数据库升级的时候,以前插入的数据都会被清空,为了解决该问题,我们可以继承DevOpenHelper类,重写onUpgrade方法,创建数据库的时候使用DevOpenHelper的子类就可以了:
package greendao; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.util.Log; /** * Created by Administrator on 2016/4/25. * 因为默认的greenDao生成的OpenHelper数据库操作,在进行更新的时候会先删除原来的表,再创建(为了防止丢失数据) */ public class MyDevOpenHelper extends DaoMaster.DevOpenHelper { public MyDevOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) { super(context, name, factory); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i("wrx153", "oldVersion" + oldVersion); Log.i("wrx153", "newVersion" + newVersion); switch (oldVersion) { case 0: //创建新表 //为表增加字段 break; } } }4、使用BeanDao提供的方法实现CRUD
4.1、查询
/** *通过key值获取Bean */ public Box loadBox(long key) { return mBoxDao.load(key); } /** *得到数据库中所有的Bean */ public List<Box> loadAllBox() { return mBoxDao.loadAll(); } /** *通过where语句查询 */ public List<Box> queryBox(String where, String... params) { return mBoxDao.queryRaw(where, params); } /** *通过QueryBuilder查询 */ public List<Box> queryBuilderBox(){ QueryBuilder builder = mBoxDao.queryBuilder() .where(BoxDao.Properties.Id.gt(5)); return builder.list(); }4.2 保存
public long saveBox(Box box) { return mBoxDao.insertOrReplace(box); } public void saveBoxList(final List<Box> list) { if (list == null || list.size() == 0) { return; } mBoxDao.getSession().runInTx(new Runnable() { @Override public void run() { for (int i = 0; i < list.size(); i++) { Box box = list.get(i); mBoxDao.insertOrReplace(box); } } }); }4.3 删除
public void deleteAllBox() { mBoxDao.deleteAll(); } public void deleteBox(long key) { mBoxDao.deleteByKey(key); } public void deleteBox(Box box) { mBoxDao.delete(box); }
完整代码如下:
package greendao;
import android.content.Context;
import java.util.List;
import de.greenrobot.dao.query.QueryBuilder;
/**
* Created by Administrator on 2016/4/26.
*/
public class BoxDaoManager {
private static BoxDaoManager sBoxDaoManager;
private BoxDao mBoxDao;
private BoxDaoManager() {
}
public static BoxDaoManager getInstance(Context context) {
if (sBoxDaoManager == null) {
sBoxDaoManager = new BoxDaoManager();
}
sBoxDaoManager.mBoxDao = DaoHelper.getDaoSession(context).getBoxDao();
return sBoxDaoManager;
}
/** *通过key值获取Bean */ public Box loadBox(long key) { return mBoxDao.load(key); } /** *得到数据库中所有的Bean */ public List<Box> loadAllBox() { return mBoxDao.loadAll(); } /** *通过where语句查询 */ public List<Box> queryBox(String where, String... params) { return mBoxDao.queryRaw(where, params); } /** *通过QueryBuilder查询 */ public List<Box> queryBuilderBox(){ QueryBuilder builder = mBoxDao.queryBuilder() .where(BoxDao.Properties.Id.gt(5)); return builder.list(); }
public long saveBox(Box box) { return mBoxDao.insertOrReplace(box); } public void saveBoxList(final List<Box> list) { if (list == null || list.size() == 0) { return; } mBoxDao.getSession().runInTx(new Runnable() { @Override public void run() { for (int i = 0; i < list.size(); i++) { Box box = list.get(i); mBoxDao.insertOrReplace(box); } } }); }
public void deleteAllBox() { mBoxDao.deleteAll(); } public void deleteBox(long key) { mBoxDao.deleteByKey(key); } public void deleteBox(Box box) { mBoxDao.delete(box); }
}
参考:在AndroidStudio中引入GreenDao
相关文章推荐
- Mysql安装过程
- [mysql]设置Ubuntu上的MySQL可以远程访问
- 解决MySQL5.6出现"Using a password on the command line interface..."
- MySQL 多表连接查询
- redis的aof持久化深入解析
- Redis启动多端口、运行多实例
- sql语句查询日期 持续更新
- SQL的内置函数(转)
- Oracle聊天系统设计
- SQL in 与inner join查询结果的区别
- SQL SERVER 2012/2014 序列号密钥
- oracle创建计划任务
- SQL函数说明大全
- mysql储存过程多游标
- Mysql 入门篇
- ORACLE临时表总结
- ASP.NET项目中的web.config文件里配置数据库连接并在程序代码中获取连接字符串
- Oracle中dual表的用途介绍-转
- mysql中利用ceil函数对成绩进行分段统计
- Sql日期时间格式转换