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