Trước hết, không rõ từ mô tả của bạn về những gì bạn đã làm, nhưng bạn cần một PlaylistSongs
bảng chứa a PlaylistId
và a SongId
, mô tả những bài hát thuộc danh sách phát nào.
Trong bảng này, bạn phải thêm thông tin đặt hàng.
Cơ chế yêu thích của tôi là với những con số thực. Tôi đã thực hiện nó gần đây, và nó hoạt động như một cơ duyên. Khi bạn muốn di chuyển một bài hát đến một vị trí cụ thể, bạn tính Ordering
giá trị mới của nó là giá trị trung bình của các Ordering
giá trị của bài hát trước đó và bài hát tiếp theo. Nếu bạn sử dụng số thực 64 bit, bạn sẽ hết độ chính xác cùng lúc với địa ngục sẽ đóng băng, nhưng nếu bạn thực sự viết phần mềm của mình cho hậu thế, thì hãy xem xét việc gán lại các Ordering
giá trị số nguyên được làm tròn đẹp cho tất cả các bài hát trong mỗi bài hát danh sách nhạc mỗi lần trong một thời gian.
Là một phần thưởng bổ sung, đây là đoạn mã mà tôi đã viết để thực hiện điều này. Tất nhiên bạn không thể sử dụng nó như hiện tại và nó sẽ là quá nhiều công việc cho tôi ngay bây giờ để vệ sinh nó cho bạn, vì vậy tôi chỉ đăng nó cho bạn để lấy ý tưởng từ nó.
Lớp này là ParameterTemplate
(bất cứ điều gì, đừng hỏi!) Phương thức lấy danh sách các mẫu tham số mà mẫu này thuộc về cha mẹ của nó ActivityTemplate
. (Dù thế nào, đừng hỏi!) Mã chứa một số bảo vệ chống lại sự chính xác. Bộ chia được sử dụng để kiểm tra: kiểm tra đơn vị sử dụng số chia lớn để nhanh chóng hết độ chính xác và do đó kích hoạt mã bảo vệ chính xác. Phương thức thứ hai là công khai và "chỉ sử dụng nội bộ; không gọi" để mã kiểm tra có thể gọi nó. (Không thể là gói riêng tư vì mã kiểm tra của tôi không nằm trong cùng gói với mã mà nó kiểm tra.) Trường kiểm soát thứ tự được gọi Ordering
, được truy cập qua getOrdering()
và setOrdering()
. Bạn không thấy bất kỳ SQL nào vì tôi đang sử dụng Ánh xạ quan hệ đối tượng thông qua Hibernate.
/**
* 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;
}