如何通过Room在本地数据库插入对象列表?附CidVo实体类代码
没问题,我来一步步教你怎么用Room批量插入CidVo对象列表,结合你给出的实体类,具体操作如下:
1. 创建Dao接口
首先你需要定义一个数据访问对象(Dao),Room的@Insert注解天然支持接收列表参数,写起来非常方便:
Kotlin版本
@Dao interface CidDao { // 批量插入List<CidVo>,可选指定冲突策略(比如重复主键时替换或忽略) @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertCidList(cidList: List<CidVo>) }
Java版本
@Dao public interface CidDao { @Insert(onConflict = OnConflictStrategy.REPLACE) void insertCidList(List<CidVo> cidList); }
说明:
onConflict是可选参数,根据业务需求选就行:
OnConflictStrategy.REPLACE:主键重复时,替换已有数据OnConflictStrategy.IGNORE:主键重复时,跳过当前插入的对象- 不指定的话默认是
OnConflictStrategy.ABORT,会直接抛出异常
2. 创建Room Database类
接下来要创建数据库的入口类,关联你的CidVo实体和上面定义的Dao:
Kotlin版本
@Database(entities = [CidVo::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun cidDao(): CidDao // 推荐单例实现,避免重复创建数据库实例 companion object { @Volatile private var INSTANCE: AppDatabase? = null fun getInstance(context: Context): AppDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "app_database" ).build() INSTANCE = instance instance } } } }
Java版本
@Database(entities = {CidVo.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract CidDao cidDao(); // 单例实现 private static volatile AppDatabase INSTANCE; public static AppDatabase getInstance(Context context) { if (INSTANCE == null) { synchronized (AppDatabase.class) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "app_database") .build(); } } } return INSTANCE; } }
3. 调用批量插入方法
最后一步就是获取Dao实例,执行插入操作。注意:Room默认禁止在主线程操作数据库,所以要放到后台线程执行。
Kotlin(协程示例)
// 在ViewModel或Repository中调用 val cidDao = AppDatabase.getInstance(context).cidDao() // 构造要插入的列表 val cidList = listOf( CidVo().apply { idCid = "cid_001" dsCid = "第一个CID" }, CidVo().apply { idCid = "cid_002" dsCid = "第二个CID" } ) // 用协程在后台执行 viewModelScope.launch(Dispatchers.IO) { cidDao.insertCidList(cidList) }
Java(Executor示例)
// 获取Dao实例 CidDao cidDao = AppDatabase.getInstance(context).cidDao(); // 构造要插入的列表 List<CidVo> cidList = new ArrayList<>(); CidVo cid1 = new CidVo(); cid1.setIdCid("cid_001"); cid1.setDsCid("第一个CID"); cidList.add(cid1); CidVo cid2 = new CidVo(); cid2.setIdCid("cid_002"); cid2.setDsCid("第二个CID"); cidList.add(cid2); // 用Executor在后台执行 ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(() -> cidDao.insertCidList(cidList)); executor.shutdown();
额外注意点
- 你的
CidVo实体中idCid是@NonNull的主键,所以每个要插入的CidVo对象必须设置有效的idCid值,否则会抛出异常。 - 如果还没配置Room依赖,记得先在项目中添加
room-runtime、room-compiler,Kotlin项目还可以加room-ktx简化操作。
内容的提问来源于stack exchange,提问作者user6008330
相关产品推荐
相关产品推荐

