우선, 당신이 한 일에 대한 설명에서 명확하지 않지만 , 어떤 노래가 어떤 재생 목록에 속하는지 설명하는 PlaylistSongs
a PlaylistId
및 a 가 포함 된 표가 필요합니다 SongId
.
이 표에는 주문 정보를 추가해야합니다.
내가 가장 좋아하는 메커니즘은 실수입니다. 최근에 구현했으며 매력처럼 작동했습니다. 노래를 특정 위치로 이동하려면 새 Ordering
값을 Ordering
이전 노래 및 다음 노래 값의 평균으로 계산합니다 . 64 비트 실수를 사용하면 지옥이 얼어 붙을 정도로 거의 정밀도가 떨어지지 만 실제로 후손을 위해 소프트웨어를 작성하는 경우 멋진 둥근 정수 Ordering
값을 각 노래의 모든 노래에 다시 할당하는 것이 좋습니다 가끔씩 재생 목록을 만듭니다.
추가 보너스로 여기에 작성한 코드가 있습니다. 물론 당신은 그것을 그대로 사용할 수 없으며, 지금 당신을 위해 그것을 소독하는 것이 너무 많은 일이 될 것이므로 아이디어를 얻을 수 있도록 게시하고 있습니다.
클래스는 ParameterTemplate
(무엇이든 묻지 않습니다!) 메소드는이 템플릿이 속한 매개 변수 템플릿 목록을 부모로부터 가져옵니다 ActivityTemplate
. (무엇이든 묻지 마십시오!) 코드에는 정밀도가 떨어지지 않도록주의해야합니다. 제수는 테스트에 사용됩니다. 단위 테스트는 큰 제수를 사용하여 정밀도가 빨리 떨어 지므로 정밀도 보호 코드가 트리거됩니다. 두 번째 방법은 공용이며 "내부 용이며 호출하지 마십시오". 테스트 코드가이를 호출 할 수 있습니다. (내 테스트 코드는 테스트 코드와 같은 패키지에없는 때문에 패키지 전용 할 수 없습니다.) 순서를 제어하는 필드가 호출 Ordering
을 통해 액세스, getOrdering()
및 setOrdering()
. 최대 절전 모드를 통해 객체 관계형 매핑을 사용하고 있기 때문에 SQL이 표시되지 않습니다.
/**
* 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;
}