批量写入 → Room 事务

批量写入 → Room 事务

老写法(Java + SQLite)

java 复制代码
// 逐条插入 --- 慢
for (Item item : items) {
    ContentValues values = new ContentValues();
    values.put("name", item.getName());
    values.put("price", item.getPrice());
    db.insert("item", null, values);
}

// 手动事务
db.beginTransaction();
try {
    for (Item item : items) {
        ContentValues values = new ContentValues();
        values.put("name", item.getName());
        values.put("price", item.getPrice());
        db.insert("item", null, values);
    }
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}

问题在哪里

不用事务时,每条 insert 都是一次独立的磁盘写入,1000 条数据可能要几秒甚至十几秒。手动开事务样板代码又多又容易漏掉 setTransactionSuccessful / endTransaction。忘写一个数据就不持久。

新写法(Room + Kotlin)

kotlin 复制代码
// 批量插入 --- 单条 @Insert 支持可变参数和 List
@Insert
suspend fun insertAll(items: List<Item>)

// 或直接在 DAO 里定义事务
@Transaction
suspend fun replaceAll(items: List<Item>) {
    deleteAll()
    insertAll(items)
}

// Repository 层用 withTransaction
class ItemRepository(private val db: AppDatabase, private val dao: ItemDao) {

    suspend fun importItems(items: List<Item>) {
        db.withTransaction {
            for (item in items) {
                dao.insert(item)
            }
        }
    }
}

一句话注意

Room 的 @Insert 传 List 时内部已经用事务包装,不必手动再套一层事务。但如果需要在一个事务里执行不同类型的操作(先删后插、多表更新),用 @Transaction 注解或 withTransaction。

@Transaction 用在 DAO 的 suspend 方法上时,Room 保证方法体在一个数据库事务里执行。但不能用在返回 Flow 的方法上------Flow 是长时间运行的观察者,事务只在单次数据库操作期间存在。


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

相关推荐
QianhangQianping9 分钟前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
海绵宝宝转agent15 分钟前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
SunnyDays101116 分钟前
Java 操作 Word 脚注和尾注:添加、读取与删除
java·word
SunnyDays101117 分钟前
Java 为 Word 添加页码:隐藏封面页码、从指定页开始编号、奇偶页页码设置等
java·word·页码
Goway_Hui19 分钟前
【KMP for OpenHarmony】Cache4k 0.14.0 鸿蒙适配
华为·kotlin·harmonyos
开源推荐官21 分钟前
多门店 O2O 商城选型复盘:从开发视角对比主流开源系统
java·架构·开源·php
吴名氏.22 分钟前
Java转AI Agent教程(第二周)超时重试与错误分类
java·人工智能·python·分类·ai agent
Android小码家38 分钟前
framework&framework-minus-apex&android.jar的区别
android·python·jar
技术风向解码者1 小时前
安卓跨端选型:为什么优先看 Kuikly
android
科小怪1 小时前
大肥鱼桌宠下载(2026最新版):在安卓桌面上养一条会走会弹会碎碎念的胖鱼
android