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();
}
}
SongVersion
和 Track
是 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);
}
}
我的应用使用的数据库 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(); } }
SongVersion
和 Track
是 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);
}
}