美文网首页IT技术
Android ORM框架 GreenDao3.3的使用

Android ORM框架 GreenDao3.3的使用

作者: 侯蛋蛋_ | 来源:发表于2017-10-25 17:32 被阅读0次

    前言

    之前用过许多的Orm框架,例如:ORMLite、greendao、ormndroid、androrm、ActiveAndroid,SugarORM等等,不过都没有一一研究,感觉GreenDao的文档和支持率比较高,所以就一直采用了GreenDao作为项目的Orm框架

    我们今天就来讲讲如何使用GreenDao3

    介绍

    greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。关于greenDAO的概念可以看官网greenDAO

    greenDao优势

    • 1、一个精简的库

    • 2、性能最大化

    • 3、内存开销最小化

    • 4、易于使用的 APIs

    • 5、对 Android 进行高度优化

    • 6、秒胜当前市面上的其他Orm框架(这个也是看总体水平,也是我为什么推崇大家用次框架的重要理由,既然要学就要学最要好用的)

    步骤

    第一步、首先导入项目

    // In your root build.gradle file:
    buildscript {
        repositories {
            jcenter()
            mavenCentral() // add repository
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.3'
            classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
        }
    }
    
    // In your app projects build.gradle file:
    apply plugin: 'com.android.application'
    apply plugin: 'org.greenrobot.greendao' // apply plugin
     
    dependencies {
        compile 'org.greenrobot:greendao:3.2.2' // add library
    }
    
    

    在build.gradle中配置版本和路径

    整体如下

    apply plugin: 'com.android.application'
    apply plugin: 'org.greenrobot.greendao' // apply plugin
    
    greendao {
        schemaVersion 1  //我们的数据库的版本号  当数据库升级的时候可以在这里改版本
        daoPackage 'com.hsm.bxt.db'  //自动生成的DaoMaster、DaoSession、Dao的包名  根据自己想放的位置改变即可
        targetGenDir 'src/main/java'  //自动生成的DaoMaster、DaoSession、Dao的路径
    }
    
    
    dependencies {
        compile 'org.greenrobot:greendao:3.2.2' // add library
    }
    

    第二步、创建一个User的实体类

    @Entity
    public class User {
        @Id 
        private Long id; 
        private String name; 
        @Transient 
        private int tempUsageCount; // not persisted  
    }
    
    • 1.实体@Entity注解

      • schema:告知GreenDao当前实体属于哪个schema
      • active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
      • nameInDb:在数据中使用的别名,默认使用的是实体的类名
      • indexes:定义索引,可以跨越多个列
      • createInDb:标记创建数据库表
    • 2.基础属性注解

      • @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
      • @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property(nameInDb="name")
      • @NotNul:设置数据库表当前列不能为空
      • @Transient :添加次标记之后不会生成数据库表的列
    • 3.索引注解

      • @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
      • @Unique:向数据库列添加了一个唯一的约束
    • 4.关系注解

      • @ToOne:定义与另一个实体(一个实体对象)的关系
      • @ToMany:定义与多个实体对象的关系

    编译项目,User实体类会自动编译,生成get、set方法并且会在com.greendao.gen目录下生成三个文件,DaoMaster 、DaoSession、Dao类;

    第三步、MakeProject

    编译项目,User实体类会自动编译,生成get、set方法并且会在com.anye.greendao.gen目录下生成三个文件;

    第四步、初始化

    public class MainActivity extends AppCompatActivity {
        private UserDao userDao;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            DaoMaster.DevOpenHelper devOpenHelper=new DaoMaster.DevOpenHelper(this,"mydb.db",null);
            DaoMaster daoMaster=new DaoMaster(devOpenHelper.getWritableDb());
            DaoSession daoSession=daoMaster.newSession();
        }
    

    1.增加单个数据

            userDao = daoSession.getUserDao();
            User user=new User((long)1,"张三");
            userDao.insert(user);
    

    如果创建表的时候,设置的id自增,即@Id(autoincrement = true),那么这里的id传值直接null就为自动增长,即为User user=new User(null,"张三");

    1.1.增加多个数据

         List<User> stuList = new ArrayList<Student>();
           stuList.add(new User((long)2,"李四");
           stuList.add(new User((long)3,"王五");
           stuList.add(new User((long)4,"赵六");
           userDao.insertInTx(stuList);
    

    2.删除

    //删除指定id
    userDao.deleteByKey(id);
    //删除指定数据
    userDao.queryBuilder().where(UserDao.Properties.Name.eq("张三")).buildDelete().executeDeleteWithoutDetachingEntities();
    //删除所有
    userDao.deleteAll();
    

    这里讲解一下删除指定数据,·userDao.queryBuilder().where()是从那里获取数据,而UserDao.Properties.Name.是指定数据,有以下方法

    和java中的代码有相同指出,比如ge(“张三”),则张三1,张三2,张三3都会删除。 eq(“张三”)只会删除张三,between删除那两个数据间的所有数据,gt除了“张三”其余张三1,张三2都删除,le小于等于数据

    这里需要注意的一点就是如果删除所有数据,id是从1从新开始,如果id1-id15删除id10-15,那么id从10开始,也就是说id从上一位id自增长

    3.查询

    3.1查询所有

    List<User> joes = userDao.queryBuilder()
      //通过LastName进行正序排序
      .orderAsc(Properties.LastName)
      .list();
    

    3.2查询指定为“job”名字的数据

    List<User> joes = userDao.queryBuilder()
      //查找FirstName=“job”的所有数据
      .where(Properties.FirstName.eq("Joe"))
      //通过LastName进行正序排序
      .orderAsc(Properties.LastName)
      .list();
    

    就是第一行改变了,所以也不是很难

    3.3查询指定数据并按顺序排列

    代码只有第一行不一样,所以只贴一下第一行,orderAsc升序,orderDesc降序

    List<Student> stuList = stuDao.queryBuilder().where(StudentDao.Properties.StuName.eq("张三")).orderDesc(StudentDao.Properties.Id).list();
    

    3.4组合查询数据 查询姓名为"张三" 并且年龄小于等于25

    比如我们在增加一个年龄age一项

    QueryBuilder<Student> stuQB = stuDao.queryBuilder();
                        stuQB.where(StudentDao.Properties.StuName.eq("张三"), StudentDao.Properties.StuScore.le("25"));
                        List<Student> stuList = stuQB.list();
    

    3.5查询所有返回数据 但只返回前三条数据

    List<Student> stuList = stuDao.queryBuilder().limit(3).list();
    

    3.6查询所有返回数据 但只返回前三条数据 并且跳过第一条数据

    List<Student> stuList = stuDao.queryBuilder().limit(3).offset(1).list();
    

    3.7查询所有信息总条数

    int stuSumCount = stuDao.queryBuilder().list().size();
    

    4.更新指定信息

     Student student = stuDao.queryBuilder()
         .where(StudentDao.Properties.StuName.eq("张三"))
         .build()
         .unique();
     if (student != null) {
         student.setStuName("I Love You");
         stuDao.update(student);
    }
    

    4.1批量更新

       WhereCondition eq = QuestionDao.Properties.Iscollect.eq(true);
                        SqlUtils.plupdate_question(false,getApplicationContext(),eq);
                    for (int i = 0; i < list.size(); i++) {
                        list.get(i).setIscollect(false);
                    }
    
                    questionList.notifyDataSetChanged();
    

    相关文章

      网友评论

        本文标题:Android ORM框架 GreenDao3.3的使用

        本文链接:https://www.haomeiwen.com/subject/zvwiuxtx.html