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

相关推荐
weiggle1 小时前
第八篇:ViewModel + Compose——生产级状态管理实践
android
亦暖筑序6 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
恋猫de小郭6 小时前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
敲代码的彭于晏6 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev8 小时前
ButterKnife → ViewBinding
android·java·kotlin
成都大菠萝21 小时前
Android Car CarProperty 车辆信号链路
android
敲代码的鱼1 天前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
时光足迹1 天前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端