欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

从使用到源代码 - 绿岛(基本使用篇)

最编程 2024-04-30 09:35:28
...

增删改查

  • 使用GreenDao时几乎可以完全摆脱手写Sql的束缚,不必担心某个字段名称写错、关键字写错、标点符号写错的问题,从而更快稳健的实现我们的想法。
  • 插入
    • 插入方式有以下两种,包括普通插入和使用事务批量插入,两者的区别通过下面代码运行结果可以很清晰的看出(++使用模拟器运行++),同样是插入100条数据,如果使用事务批量插入,效率能高个3~4倍,而如果只需要插入一条,那么对于本例而言(不排除其他情况),两者耗时是一样的,可见:
      • 当数据量大时还是集中使用批量插入更为妥当
      • 如果只需要插入一条,那么二者可任选其一
@Test
public void testGreenDaoInsert() {
   DaoSession daoSession = App.getDaoSession();
   UserDao userDao = daoSession.getUserDao();

   long start = System.currentTimeMillis();
   // 1. 普通插入,每次只能插入单条
   //insert 100: System.out: -->>Insert total used:: 83ms
   //insert 1:System.out: -->>Insert total used:: 3ms
   for (int i = 0; i < 100; i++) {
       // insertOrReplace
       userDao.insertOrReplace(new User()
               .setFirstName("firstName::" + i)
               .setLastName("lastName::" + i)
               .setGender(i % 2 == 0 ? "male" : "female")
               .setPhoneNum(String.valueOf(SystemClock.elapsedRealtimeNanos()))
               .setAge(i + 10));
   }
   
   // 2. 使用事务插入,可以进行批量插入,也可以单条插入
   //insert 100: System.out: -->>Insert total used:: 26ms
   //insert 1:System.out: -->>Insert total used:: 3ms
   /*User[] usersArray = new User[100];
   for (int i = 0; i < 100; i++) {
       // insertOrReplace
       usersArray[i] =  new User()
               .setFirstName("firstName::" + i)
               .setLastName("lastName::" + i)
               .setGender(i % 2 == 0 ? "male" : "female")
               .setPhoneNum(String.valueOf(SystemClock.elapsedRealtimeNanos()))
               .setAge(i + 10) ;
   }
   userDao.insertOrReplaceInTx(usersArray);*/


   System.out.println(String.format("-->>Insert total used:: %sms" , (System.currentTimeMillis() - start)) );

}
  • 修改
    • 修改过程也很简单,并且可以单条修改和使用事务批量修改,和插入方式是一致的,不过需要注意的是
      • 修改时需要设置要修改条目的id(也就是key),否则会修改失败
      • 修改过程是覆盖式的,意味着如果修改时Entity中某个字段值为null,那么就会覆盖掉表中对应的字段数据,这点尤为重要,因为可能小手一抖,你的数据就没了
// 修改
@Test
public void testGreenDaoUpdate() {
    DaoSession daoSession = App.getDaoSession();
    UserDao userDao = daoSession.getUserDao();

    User user = new User()
            .setId(51L)  
            .setFirstName("horseLai")
            .setAge(23)
            .setPhoneNum("1234");
    // before: User{id=51, phoneNum='5866201745180', firstName='firstName::7', gender='female', lastName='lastName::7', age=17}
    // after: User{id=51, phoneNum='1234', firstName='horseLai', gender='null', lastName='null', age=23}
    // 1. 普通修改 ,只能单条修改
    userDao.update(user);
    // 2. 批量修改, 可批量修改
    // userDao.updateInTx(user);
}
  • 删除
    • 删除过程也很简单,有以下四种方式进行,具体可按需选择,如果知道id那么13ok,如果需要指定删除条件,那么4,删除所有数据则2
// 删除
@Test
public void testGreenDaoDelete() {
    DaoSession daoSession = App.getDaoSession();
    UserDao userDao = daoSession.getUserDao();

    // 1. 删除单个
    // userDao.deleteByKey(15L);
    
    // 2. 删除所有
    userDao.deleteAll();
    
    // 3. 批量删除(前提是知道key,也就是id)
    userDao.deleteByKeyInTx(15L, 16L,17L);

    // 4. 批量(按查找条件)删除
    userDao.queryBuilder()
            .where(UserDao.Properties.Age.gt(15))
            .buildDelete()
            .executeDeleteWithoutDetachingEntities();
}

  • 查找
    • 查找也很容易,可以按需选择,在以下实例中已经体现的很清楚,相对来说如果条件简单的话,使用sql语句进行查询(方式2)会简洁很多,其次是使用方式1,最后是使用方式3,不过我感觉没人会喜欢使用方式3,除非有什么特殊需求,毕竟看到那一大串代码你就想敬而远之,还有可能会忘记释放cursor,导致内存泄漏。
// 查找
@Test
public void testGreenDaoQuery() {

    DaoSession daoSession = App.getDaoSession();
    UserDao userDao = daoSession.getUserDao();
    // 1. 查询
    /*List<User> users = userDao.queryBuilder()
            .limit(10)
            .orderAsc(UserDao.Properties.Age)
            .where(UserDao.Properties.Age.gt(15))
            .build()
            .list();*/

    //  2. 通过sql语句查询
    /*List<User> users = userDao.queryRaw("where age = ?", "15");
    for (User user : users) {
        System.out.println(user.toString());
    }*/

    // 3. 通过cursor查询
    Cursor cursor = userDao.queryBuilder()
            .limit(10)
            .orderAsc(UserDao.Properties.Age)
            .where(UserDao.Properties.Age.gt(15))
            .buildCursor().query();
    try {
        if (cursor != null) {
            System.out.println("-->> cursor count::" + cursor.getCount());
            if (cursor.getCount() == 0) {
                return;
            }
            String[] columnNames = cursor.getColumnNames();
            System.out.println("-->> columnNames::" + Arrays.toString(columnNames));

            StringBuilder sb = new StringBuilder();
            cursor.moveToFirst();
            while (cursor.moveToNext()) {
                String firstName = cursor.getString(cursor.getColumnIndex(UserDao.Properties.FirstName.columnName));
                String lastName = cursor.getString(cursor.getColumnIndex(UserDao.Properties.LastName.columnName));
                String gender = cursor.getString(cursor.getColumnIndex(UserDao.Properties.Gender.columnName));
                String phone = cursor.getString(cursor.getColumnIndex(UserDao.Properties.PhoneNum.columnName));
                int age = cursor.getInt(cursor.getColumnIndex(UserDao.Properties.Age.columnName));

                sb.append("\n{\nfirstName=").append(firstName).append(",\n")
                        .append("lastName=").append(lastName).append(", \n")
                        .append("gender=").append(gender).append(", \n")
                        .append("phone=").append(phone).append(", \n")
                        .append("age=").append(age).append(", \n")
                        .append("}");
            }

            System.out.println(sb.toString());
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }

    // 统计相应条件下的条目数量,如果需要查询数量,而不需要提取数据,
    // 那么请使用这种方式,不然性能浪费是明显的。
   /* long totalCount = userDao.queryBuilder()
            .limit(10)
            .orderAsc(UserDao.Properties.Age)
            .where(UserDao.Properties.Age.gt(15))
            .buildCount()
            .count();

    System.out.println("-->>Total Count::" + totalCount);*/

}