2016-04-28 104 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()方法的實現並不容易。你可以添加這部分的代碼? –