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 老项目迁移系列,持续更新中。

相关推荐
一 乐12 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
卓怡学长12 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn12 小时前
Spring 注解使用详解
java·spring
其实防守也摸鱼12 小时前
Fastjson 反序列化漏洞(JNDI注入)
android·数据库·安全·oracle·自动化·fastjson·反序列化
一条小小yu12 小时前
Spring IoC的理解
java·后端·spring
落魄实习生13 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
旺仔学长 哈哈13 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
狗凯之家源码网14 小时前
微博图床 PHP 系统搭建与实战应用指南
android·开发语言·php
自强的小白14 小时前
核心功能(Service接口)
java·mybatis