Temi机器人Android平台Room DAO插入数据失效问题求解
问题核心原因
你插入失败是AudioFile实体类的主键配置错误导致的:
- 你给
audioFileID加了@PrimaryKey注解但没有开启自增,构造函数也没有给该字段赋值,所有新建的AudioFile实例的audioFileID都是int类型的默认值0 - 你的插入策略配置为
OnConflictStrategy.IGNORE,第一次插入主键0成功后,后续所有插入都会因为主键冲突被直接静默忽略,自然看不到新条目入库。
修复方案
- 调整AudioFile实体类的主键配置,开启自增:
@Entity public class AudioFile { // 加上autoGenerate = true,让Room自动生成唯一主键 @PrimaryKey(autoGenerate = true) private int audioFileID; private String uriPath; private String name; public AudioFile(String uriPath, String name) { this.setUriPath(uriPath); this.name = name; } // 原有getter、setter逻辑全部保留即可 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAudioFileID() { return audioFileID; } public void setAudioFileID(int audioFileID) { this.audioFileID = audioFileID; } public String getUriPath() { return uriPath; } public void setUriPath(String uriPath) { this.uriPath = uriPath; } }
- (可选)修改DAO的insert方法返回值,方便快速排查插入结果:
@Insert(entity = AudioFile.class,onConflict = OnConflictStrategy.IGNORE) // 返回值为插入成功的行ID,返回-1代表插入失败(通常是主键冲突导致) Long insert(AudioFile audioFile);
插入后打印返回值即可快速确认插入是否成功。
额外优化建议
你现有代码里的while (!future.isDone()){}是在主线程空转阻塞,不符合Android开发规范,建议把UI更新逻辑移到异步任务末尾,切主线程执行:
var future = TemiPatrolRoomDatabase.databaseWriteExecutor.submit(() -> { Log.d(TAG, "audio name to be inserted:"+audioFile.getName()); Long insertResult = temiPatrolDAO.insert(audioFile); Log.d(TAG, "insert result: " + insertResult); var a = (ArrayList<AudioFile>) temiPatrolDAO.getAll(); Log.d(TAG, "after insertion"); for (var a1 : a) { Log.d(TAG, "file name:" + a1.getName()); } // 切主线程更新UI requireActivity().runOnUiThread(() -> { audioFiles.add(audioFile); customAdapter.notifyDataSetChanged(); }); });
删掉原来的空转while循环和外部的UI更新代码即可。
内容的提问来源于stack exchange,提问作者m2h9
相关产品推荐
相关产品推荐

