从使用到源代码 - 绿岛(基本使用篇)
最编程
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
那么1
和3
都ok
,如果需要指定删除条件,那么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);*/
}
推荐阅读