GreenDao如何通过非主键列更新数据表?
GreenDao实现非主键条件更新的方案
针对你需要执行UPDATE STUDENT_TABLE SET ADDRESS = 'Texas' WHERE NAME = 'David';这类非主键更新的需求,GreenDao提供了几种实用的实现方式:
1. 直接调用updateRaw方法(快速简洁)
利用updateRaw方法直接执行原生SQL片段,注意用占位符避免SQL注入:
DaoSession daoSession = ((App) getApplication()).getDaoSession(); StudentDao studentDao = daoSession.getStudentDao(); // 通过占位符传递参数,替换SQL中的? studentDao.updateRaw("SET ADDRESS = ? WHERE NAME = ?", "Texas", "David");
2. 使用UpdateStatement(更安全,减少硬编码)
通过GreenDao提供的UpdateStatement结合生成的列常量构建更新,避免手动拼写列名出错:
DaoSession daoSession = ((App) getApplication()).getDaoSession(); StudentDao studentDao = daoSession.getStudentDao(); Database db = studentDao.getDatabase(); // 创建针对Student表的更新语句 UpdateStatement updateStmt = db.updateStatement(StudentDao.TABLENAME); // 绑定第一个占位符的值(对应ADDRESS字段) updateStmt.bindString(1, "Texas"); // 设置WHERE条件:NAME等于David,使用自动生成的Properties常量 updateStmt.where(StudentDao.Properties.Name.eq("David")); // 执行更新操作 updateStmt.execute();
3. 查询后更新(面向对象,适合小数据量)
如果数据量不大,可以先查询出符合条件的对象,更新后再保存,这种方式更贴近ORM的面向对象特性:
DaoSession daoSession = ((App) getApplication()).getDaoSession(); StudentDao studentDao = daoSession.getStudentDao(); // 查询所有name为David的学生 List<Student> targetStudents = studentDao.queryBuilder() .where(StudentDao.Properties.Name.eq("David")) .list(); // 遍历更新每个学生的地址 for (Student student : targetStudents) { student.setAddress("Texas"); studentDao.update(student); }
各方案对比
updateRaw:实现最快,但需注意SQL语法正确性和注入风险,适合简单场景。UpdateStatement:更安全可靠,利用自动生成的常量避免硬编码错误,推荐用于复杂条件更新。- 查询后更新:直观易懂,但会产生额外的查询开销,仅适合数据量较小的场景。
内容的提问来源于stack exchange,提问作者L. Swifter
相关产品推荐
相关产品推荐

