GreenDAO → Room

GreenDAO → Room

老写法(Java + GreenDAO)

java 复制代码
// GreenDAO 生成的类
@Entity
public class Item {
    @Id private Long id;
    private String name;
    private double price;
}

// 使用
DaoSession daoSession = ((App) getApplication()).getDaoSession();
ItemDao itemDao = daoSession.getItemDao();

// 插入
Item item = new Item(null, "商品1", 9.99);
itemDao.insert(item);

// 查询
List<Item> items = itemDao.queryBuilder()
        .where(ItemDao.Properties.Price.gt(5.0))
        .list();

问题在哪里

GreenDAO 依赖自己的一套代码生成器 GreenDAO Generator,需要额外维护一个 Java 项目来生成实体和 DAO。不支持 Kotlin suspend 函数。库已经很久不更新了(最后发布是 2019 年),未来 Android 版本可能不兼容。

新写法(Room)

kotlin 复制代码
@Entity(tableName = "item")
data class Item(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,
    val name: String,
    val price: Double
)

@Dao
interface ItemDao {
    @Insert
    suspend fun insert(item: Item): Long

    @Query("SELECT * FROM item WHERE price > :minPrice")
    suspend fun getByPrice(minPrice: Double): List<Item>
}

// 使用
viewModelScope.launch(Dispatchers.IO) {
    itemDao.insert(Item(name = "商品1", price = 9.99))
    val items = itemDao.getByPrice(5.0)
}

一句话注意

GreenDAO 的实体类需要保留------字段映射到 Room 的 @Entity。ID 自增策略注意:GreenDAO 用包装类型 Long 表示自增,Room 用 Long = 0 + autoGenerate = true。字段类型基本一一对应,迁移成本低。

GreenDAO 的 queryBuilder 链式查询在 Room 里改成 @Query 注解里的 SQL,放弃了类型安全的查询构建但换来了 SQL 的完全可控和编译期验证。


Java Android 老项目迁移系列,持续更新中。

相关推荐
好好沉淀8 分钟前
@NotBlank(message = “{xxx}“) 注解中花括号的含义
java
fīɡЙtīиɡ ℡14 分钟前
内存泄漏产生的原因
java·spring·servlet
码智社2 小时前
Java实现RSA密钥生成、加密解密、加签验签
java
码农coding2 小时前
android 12 中的VSYNC的请求
android
wear工程师2 小时前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
Iruoyaoxh2 小时前
栈和队列~
java·开发语言
审小匠OpenCPAi2 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
Hrain-AI2 小时前
2026 企业 AI 编程智能体实战:Codex 与 Claude Code
开发语言·人工智能·kotlin
YF02112 小时前
详解Android所有文件访问权限
android
码上上班2 小时前
docker课程
java·docker·容器