Greendao:如何更新对多实体

Greendao: How to update to-many entities

我的应用使用的数据库 SongVersions 有很多 Tracks。这种 to-manx 关系由 greendao 生成,目前运行良好。

但现在我尝试更新曲目 - 假设将其静音 - 并且更新只会在下一个应用程序启动之前进行。这是因为 udpate 仅反映在缓存的曲目列表中,而没有真正持久化到数据库中。

到目前为止,这是我的代码(不工作)

// iterate through tracks
for (Track track : mSongVersion.getTrackList()) {

  if (trackId.equals(track.getId())) {
   // mute specific track
   track.setMuted(muted);
   mSongVersion.update();
  }
}

SongVersionTrack 是 greendao 生成的实体 类。 SongVersion 有 update() 方法,但 Track 没有 update() 方法。所以我在想,必须通过使用 SongVersion#update() 更新 "the whole thing" 来更新特定曲目。 但此调用仅更新 SongVersion,忽略其轨道的变化...

我也尝试了一些变体(不)重置曲目列表以确保(没有)缓存值在干扰,但也无济于事。

编辑:

下面是一些可能有用的代码。

歌曲版本(由greendao生成!):


/** Used for active entity operations. */
private transient SongVersionDao myDao;

/** called by internal mechanisms, do not call yourself. */
public void __setDaoSession(DaoSession daoSession) {
  this.daoSession = daoSession;
  myDao = daoSession != null ? daoSession.getSongVersionDao() : null;
}

public void update() {
  if (myDao == null) {
    throw new DaoException("Entity is detached from DAO context");
  }    
  myDao.update(this);
}

部分数据库生成java:

public static void main(String[] args) throws Exception {
  Schema schema = new Schema(1, "my.app.database");

  Entity songVersion = schema.addEntity("SongVersion");
  Entity track = schema.addEntity("Track");

  // SongVersion fields w/o relations
  songVersion.setHasKeepSections(true);
  songVersion.addIdProperty().autoincrement();
  songVersion.addStringProperty("name").notNull();

  // Track fields w/o relations
  track.setHasKeepSections(true);
  track.implementsInterface("Comparable");
  track.addIdProperty().autoincrement();
  track.addBooleanProperty("muted").notNull();

  // relations
  Property songVersionId =
  track.addLongProperty("songVersionId").notNull().getProperty();
  songVersion.addToMany(track, songVersionId);
}

我认为您应该在修改列表实例后使用TrackDAO 来更新曲目。像这样:

daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
trackDao = daoSession.getTrackDao();

// iterate through tracks
for (Track track : mSongVersion.getTrackList()) {

  if (trackId.equals(track.getId())) {
   // mute specific track
   track.setMuted(muted);
   trackDao.update(track);
  }
}