greenDao 实践
greenDAO 设计的主要特点
- greenDAO 性能远远高于同类的 ORMLite,具体测试结果可见官网
- greenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。
- 与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO 使用「Code generation」的方式,这也是其性能能大幅提升的原因。
一,创建
1, 添加依赖
compile 'de.greenrobot:greendao:2.1.0'
2, main下创建目录java-gen用于存放生成的 Bean、DAO、DaoMaster、DaoSession 文件,同时在build中配置
sourceSets { main { java.srcDirs = ['src/main/java', 'src/main/java-gen'] } }
3,创建新的module 用于生成java-gen中的dao文件,在新建的module的build中添加依赖
compile ‘de.greenrobot:greendao-generator:2.1.0’
4.创建GreenDaoHelper类 简单的java类
private final static String PACK_NAME = "com.jonas.greendao";//(java-gen目录下Java类的包名) //指向之前创建的java-gen文件夹,路径获取方法(右键java-gen文件夹--copyPath即可) private final static String DAO_PATH = "E:\\ASWorld\ASLearn\\GreenDaoPractice\\app\\src\\main\\java-gen"; //private final static String DAO_PATH = "E:/ASWorld/ASLearn/GreenDaoPractice/app/src/main/java-gen"; public static void main(String[] args) throws Exception{ //1,创建 用于添加实体类/表 的 模式对象(Schema) Schema schema = new Schema(1, PACK_NAME); //2,添加实体类/表 addTables(schema); //3,通过DAOGenerator对象的generateAll 按照模式对象自动生成ben,dao等文件写入java-gen new DaoGenerator().generateAll(schema,DAO_PATH); } ------------------ private static void addTables(Schema schema){ //--------添加表1---------- //根据表名 通过addEntity直接添加空表 Entity pic = schema.addEntity("PictureCache");//生成的bean对象 名字,首字母大写(不允许命名为Table报错) //pic.setTableName("自定义表名"); //---给表 添加属性---- pic.addIdProperty();//表id 默认重1开始 pic.addStringProperty("desc").notNull();//描述 pic.addDateProperty("time");//时间 //--------添加表2---------- }
5,运行GreenDaoHelper(选中文件–右键–run) java-gen就会生成文件 一张表对应两个(bean,beanDao),DaoMaster,DaoSession
二,使用
1,官方推荐将获取 DaoMaster 对象的方法放到 Application 层,这样将避免多次创建生成 Session 对象 (清单文件配置application–name)
主要涉及对象 DaoMaster.DevOpenHelper,DaoMaster,DaoSession,SQLiteDatabase,【tableName】Dao(增删改查) // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。 // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。 // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。 // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。 DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "test-db", null); SQLiteDatabase db = devOpenHelper.getWritableDatabase(); // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。 DaoMaster daoMaster = new DaoMaster(db); mDaoSession = daoMaster.newSession();//可以获取 已创建的表的操作对象 [tablename]Dao对象 对表的内容增删改查
2,通过DaoSession对象 ,获取表操作对象[tableName]Dao
mDaoSession = ( (app)getApplication() ).getDaoSession(); PicDao mPicDao = mDaoSession.getPicDao();
3,通过表操作对象([表名]Dao)进行增删改查
-----------增------------- 1,先创建表对象 Pic pic = new Pic(null, text, new Date()); 2,通过[表名]Dao对象insert mPicDao.insert(pic); ----------改--------------- update(T entity);//根据entiry的id匹配 然后修改相应数据 ----------查--queryBuilder------------- list mPicDao.queryBuilder().list();//查询所有数据 返回集合 //查询工具queryBuilder().where(查询条件).orderAsc(排序条件) list mPicDao.queryBuilder().where(PicDao.Properties.Desc.eq("te")).orderAsc(PicDao.Properties.Time); //查询条件。。属性名是否(eq,like,notEq,isNull,isNotNull,between,in(IN (..., ..., ...)),notIn,gt(>),lt(<),ge(>=),le(<=)) //获取表的属性名 [表名]Dao.Properties.属性 ----------删--------------- delete(T entity)//内部调用 deleteByKey(key); 当不存在此key时 会抛异常Entity has no key deleteByKey(key);//通过id删除 id是自增的 deleteInTx(Iterable<T> entities)//list继承Iterable,删除集合所有。 按条件查出一个集合 然后删除,即按条件删除