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

相关推荐
斌糖雪梨2 小时前
spring auth 核心流程详解
java·后端·spring
芝麻别开门3 小时前
gst-shark安卓编译使用方法
android·gstreamer·gst-shark
文丑颜不良啊3 小时前
LeetCode201~225题目解析
java·leetcode
SL_staff5 小时前
4G设备掉线三层归因指南:SIM卡、模组、JVS-IOT网关配置精准锁定
java·物联网·产品
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 黑名单:取消黑名单
java·windows·交友
杨杨杨大侠6 小时前
DeepSeek Harness:连 Agent Loop 都能替换的插件架构
java·人工智能·agent
SL_staff6 小时前
私有化低代码运维三重雷区:JVS开源栈中的Kafka/ES/RabbitMQ治理实践
java·低代码·全栈
yuniko-n6 小时前
【算法】约瑟夫环问题
java·算法
2501_915921436 小时前
iOS应用耗电测试:使用Energy Log、Keymob和Instruments进行性能监控与能源消耗分析
android·ios·小程序·https·uni-app·iphone·webview
郝亚军7 小时前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构