2016-04-28 71 views
1

我的应用程序使用的数据库具有许多TracksSongVersions。这种to-manx关系是由greendao生成的,目前工作正常。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 genertated的entitiy类。 SongVersion有更新() - 方法,但Track没有update() - 方法。所以我认为必须通过使用SongVersion#update()更新“整个事物”来更新特定曲目。 但是这个调用只更新SongVersion,忽略其轨道的变化...

我也尝试了一些变化(不)重置轨道列表,以确保(不)缓存的值是干扰,但也无济于事。

编辑:

下面是一些代码,可能会有帮助。

SongVersion (由greendao产生!):数据库生成的Java

 

/** 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); 
} 

配件:

 
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); 
} 

回答

1

我认为你应该使用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); 
    } 
} 
+0

这就是我的问题。我可以使用更新(对象) - 方法从TrackDao(即从AbstractDao的继承更新方法),但后来我仍然不知道为什么产生SongVersion提供了一个方便的update() - 方法与myDao场和Track在一起才不是。 – muetzenflo

+0

我只是使用trackDao测试它,它的工作原理。但是我仍然很乐意解释关于缺少生成的update() - 方法...... – muetzenflo

+0

要看看SongVersion.update()方法的实现并不容易。你可以添加这部分的代码? –