Her şeyden önce, ne yaptığınızla ilgili açıklamanız net değil, ancak hangi şarkıların hangi çalma listelerine ait olduğunu açıklayan PlaylistSongs
a PlaylistId
ve a içeren bir tabloya ihtiyacınız var SongId
.
Bu tabloda sipariş bilgileri eklemelisiniz.
En sevdiğim mekanizma gerçek sayılarla. Son zamanlarda uyguladım ve bir cazibe gibi çalıştı. Bir şarkıyı belirli bir konuma taşımak istediğinizde, yeni Ordering
değerini Ordering
önceki şarkının ve sonraki şarkının değerlerinin ortalaması olarak hesaplarsınız . 64 bit gerçek bir sayı kullanırsanız, cehennemin donacağıyla aynı zamanda kesinlikten kurtulacaksınız, ancak yazılımınızı posterity için gerçekten yazıyorsanız, her bir şarkıdaki Ordering
tüm şarkılar için güzel yuvarlak tamsayı değerlerini yeniden atamayı düşünün arada bir çalma listesi.
Ek bir bonus olarak, bunu uygulayan yazdığım kod. Tabii ki olduğu gibi kullanamazsınız ve şu anda sizin için sterilize etmek benim için çok fazla iş olurdu, bu yüzden sadece ondan fikir almak için gönderiyorum.
Sınıf ParameterTemplate
(ne olursa olsun sorma!) Yöntem, bu şablonun üst öğesinden ait olduğu parametre şablonlarının listesini alır ActivityTemplate
. (Her neyse, sormayın!) Kod, hassasiyetin tükenmesine karşı biraz koruma içerir. Bölen test için kullanılır: birim testi, hassasiyeti hızlı bir şekilde bitirmek ve böylece hassas koruma kodunu tetiklemek için büyük bir bölücü kullanır. İkinci yöntem herkese açıktır ve "yalnızca dahili kullanım için; çağırmayın", böylece test kodu onu çağırabilir. (Test kodum test ettiği kodla aynı pakette olmadığından pakete özel olamaz.) Siparişi kontrol eden alana çağrılan ve Ordering
üzerinden erişilir . Hibernate üzerinden Nesne İlişkisel Eşleme kullandığım için herhangi bir SQL görmüyorsunuz.getOrdering()
setOrdering()
/**
* Moves this {@link ParameterTemplate} to the given index in the list of {@link ParameterTemplate}s of the parent {@link ActivityTemplate}.
*
* The index must be greater than or equal to zero, and less than or equal to the number of entries in the list. Specifying an index of zero will move this item to the top of
* the list. Specifying an index which is equal to the number of entries will move this item to the end of the list. Any other index will move this item to the position
* specified, also moving other items in the list as necessary. The given index cannot be equal to the current index of the item, nor can it be equal to the current index plus
* one. If the given index is below the current index of the item, then the item will be moved so that its new index will be equal to the given index. If the given index is
* above the current index, then the new index of the item will be the given index minus one.
*
* NOTE: this method flushes the persistor and refreshes the parent node so as to guarantee that the changes will be immediately visible in the list of {@link
* ParameterTemplate}s of the parent {@link ActivityTemplate}.
*
* @param toIndex the desired new index of this {@link ParameterTemplate} in the list of {@link ParameterTemplate}s of the parent {@link ActivityTemplate}.
*/
public void moveAt( int toIndex )
{
moveAt( toIndex, 2.0 );
}
/**
* For internal use only; do not invoke.
*/
public boolean moveAt( int toIndex, double divisor )
{
MutableList<ParameterTemplate<?>> parameterTemplates = getLogicDomain().getMutableCollections().newArrayList();
parameterTemplates.addAll( getParentActivityTemplate().getParameterTemplates() );
assert parameterTemplates.getLength() >= 1; //guaranteed since at the very least, this parameter template must be in the list.
int fromIndex = parameterTemplates.indexOf( this );
assert 0 <= toIndex;
assert toIndex <= parameterTemplates.getLength();
assert 0 <= fromIndex;
assert fromIndex < parameterTemplates.getLength();
assert fromIndex != toIndex;
assert fromIndex != toIndex - 1;
double order;
if( toIndex == 0 )
{
order = parameterTemplates.fetchFirstElement().getOrdering() - 1.0;
}
else if( toIndex == parameterTemplates.getLength() )
{
order = parameterTemplates.fetchLastElement().getOrdering() + 1.0;
}
else
{
double prevOrder = parameterTemplates.get( toIndex - 1 ).getOrdering();
parameterTemplates.moveAt( fromIndex, toIndex );
double nextOrder = parameterTemplates.get( toIndex + (toIndex > fromIndex ? 0 : 1) ).getOrdering();
assert prevOrder <= nextOrder;
order = (prevOrder + nextOrder) / divisor;
if( order <= prevOrder || order >= nextOrder ) //if the accuracy of the double has been exceeded
{
parameterTemplates.clear();
parameterTemplates.addAll( getParentActivityTemplate().getParameterTemplates() );
for( int i = 0; i < parameterTemplates.getLength(); i++ )
parameterTemplates.get( i ).setOrdering( i * 1.0 );
rocs3dDomain.getPersistor().flush();
rocs3dDomain.getPersistor().refresh( getParentActivityTemplate() );
moveAt( toIndex );
return true;
}
}
setOrdering( order );
rocs3dDomain.getPersistor().flush();
rocs3dDomain.getPersistor().refresh( getParentActivityTemplate() );
assert getParentActivityTemplate().getParameterTemplates().indexOf( this ) == (toIndex > fromIndex ? toIndex - 1 : toIndex);
return false;
}