为了账号安全,请及时绑定邮箱和手机立即绑定

ROOM持久性库更新和删除不会改变任何东西

ROOM持久性库更新和删除不会改变任何东西

UYOU 2023-09-27 16:28:08
我正在编写小型应用程序,并为其使用空间。SQLite 包装器。就我的代码工作而言,有一些功能不起作用。此外,文档似乎非常不完整,或者在某些方面是错误的。例如dao注解@Update和@Delete。我慢慢地对使用这个框架感到困惑,并且我考虑重新使用 SQLite API 而不是它。您对房间有何看法?现在是我想问的主要问题。我将向您展示我的代码,也许您会明白为什么不能正常工作。首先,我的实体和道。它应该代表一个音频文件。@Entity(tableName = "audiofile")public class AudioFile{    @PrimaryKey(autoGenerate = true)    private long id;    @ColumnInfo(name = "title")    private String title;    @ColumnInfo(name = "artist")    private String artist;    @ColumnInfo(name = "path")    private String path;    @ColumnInfo(name = "duration")    private long duration;@Daopublic interface AudioFileDao{    @Query("SELECT * FROM audiofile WHERE title LIKE :title")    AudioFile getAudioFile(String title);    @Query("SELECT * FROM audiofile")    List<AudioFile> getAll();    @Insert(onConflict = OnConflictStrategy.REPLACE)    void initAudioFiles(AudioFile... audioFiles);    @Update    void updateAudioFile(AudioFile... audioFiles);//        @Query("DELETE FROM audiofile WHERE id = :audioFileId")    @Delete    void deleteAudioFile(AudioFile audioFile);    @Insert    void insertAll(AudioFile... audioFiles);    @Insert    long insertAudioFile(AudioFile audioFile);}那是常规的数据库管理器。@Database(entities = {AudioFile.class}, version = 1)public abstract class DbManager extends RoomDatabase{    private static DbManager INSTANCE;    public abstract AudioFile.AudioFileDao audioFileDao();    public static DbManager getDbManager(Context ctx){        if (INSTANCE == null){            INSTANCE = Room.databaseBuilder(ctx.getApplicationContext(), DbManager.class, "playlist").build();        }        return INSTANCE;    }    public static void destroyInstance(){        INSTANCE = null;    }}
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

现在是我想问的主要问题。我将向您展示我的代码,也许您会明白为什么不能正常工作。


我相信您的问题是,当您插入 AudioFile 时,未设置 id,因此 AudioFile 对象 audioFile 中的 id 为 0。但是,插入时,id 将自动生成,并且不会为 0,而可能是某个时间插入的 AudioFile 对象的数量 + 1。


如果不设置id,则使用相同的 AudioFile 对象来更新/删除将尝试使用0的 id 来更新删除。不会有这样的行。


假设AudioFile 存在setId方法,但不处理失败的插入,可以使用以下修复:-


audioFile.setId(audioFileDao.insertAudioFile(audioFile));

可以处理未导致异常的失败插入的修复可能是:-


long insertedId = audioFileDao.insertAudioFile(audioFile);

if (insertedId > 0) {

    audioFile.setId(insertedId);

} else {

    //......... handle not inserted

}

示例/演示

以下代码运行时显示上述内容(您的 Entity 和 Dao 已按原样复制):-


    ...... database built

    mAudioFileDao = mAppDB.audioFileDao();


    AudioFile a = new AudioFile();

    a.setTitle("MySong");

    a.setDuration(5);

    a.setArtist("Fred");

    a.setPath("/thepath");


    logAudioFile(a,"Before Insert into DB");

    long currentId = mAudioFileDao.insertAudioFile(a); //<<<<<<<<<< INSERT INTO DB

    logAudioFile(a,"Immediately after Insert. ID returned from insert is " + currentId);

    a.setId(currentId); //<<<<<<<<<< SET the the id of the AudioFile object a

    logAudioFile(a,"After setting the ID to " + currentId);

    mAudioFileDao.updateAudioFile(a);

    List<AudioFile> audioFileList = mAudioFileDao.getAll();

    for (AudioFile af: audioFileList) {

        logAudioFile(af,"Extracted from DB");

    }

    mAudioFileDao.deleteAudioFile(a);

    Log.d("AUDIOFILEINFO","Attempt to delete Audio File undertaken");

    audioFileList = mAudioFileDao.getAll();

    for (AudioFile af: audioFileList) {

        logAudioFile(af,"After deletion");

    }

logAudioFile方法是: -


private void logAudioFile(AudioFile a, String extra) {

    Log.d(

            "AUDIOFILEINFO",

            "Title is " + a.getTitle() +

                    " ID is " + a.getId() +

                    "\n\tExtra Info is " + extra

    );

}

结果(上面的日志):-

2019-10-06 11:03:39.757 D/AUDIOFILEINFO: Title is MySong ID is 0

        Extra Info is Before Insert into DB

2019-10-06 11:03:39.808 D/AUDIOFILEINFO: Title is MySong ID is 0

        Extra Info is Immediately after Insert. ID returned from insert is 1

2019-10-06 11:03:39.808 D/AUDIOFILEINFO: Title is MySong ID is 1

        Extra Info is After setting the ID to 1

2019-10-06 11:03:39.829 D/AUDIOFILEINFO: Title is MySong ID is 1

        Extra Info is Extracted from DB

2019-10-06 11:03:39.831 D/AUDIOFILEINFO: Attempt to delete Audio File undertaken

您对房间有何看法?

这是征求意见,所以是题外话。



查看完整回答
反对 回复 2023-09-27
  • 1 回答
  • 0 关注
  • 72 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信