Android Sqlite数据库重新排列行

Android Sqlite数据库重新排列行,android,database,sqlite,android-sqlite,Android,Database,Sqlite,Android Sqlite,我在我的Android应用程序中使用sqlite db,我希望我的db在用户更改顺序时重新排列行。它应该影响所有其他行,以便我可以按上次保存的顺序显示数据 下图显示了我的数据库。如果我把第二排移到第六排,我的第三排应该是第二排,第四排应该是第三排,依此类推到第六排。如何使用查询来完成 这是我在数据库中使用的类似代码片段: if(newPosition < currentPosition) { db.rawQuery("UPDATE " + TABLE_NAME + " SET "

我在我的Android应用程序中使用sqlite db,我希望我的db在用户更改顺序时重新排列行。它应该影响所有其他行,以便我可以按上次保存的顺序显示数据

下图显示了我的数据库。如果我把第二排移到第六排,我的第三排应该是第二排,第四排应该是第三排,依此类推到第六排。如何使用查询来完成


这是我在数据库中使用的类似代码片段:

if(newPosition < currentPosition) {
    db.rawQuery("UPDATE " + TABLE_NAME + " SET " +
                Entry.COLUMN_NAME_ORDER + " = " + Entry.COLUMN_NAME_ORDER + "+1 "
                + "WHERE " + /* any additional requirements as needed */
                + Entry.COLUMN_NAME_ORDER + " BETWEEN " + newPosition + " AND " + currentPosition,
               null);
} else if(newPosition > currentPosition) {
    db.rawQuery("UPDATE " + TABLE_NAME + " SET " +
                Entry.COLUMN_NAME_ORDER + " = " + Entry.COLUMN_NAME_ORDER + "-1 "
                + "WHERE " /* any additional requirements as needed */
                + Entry.COLUMN_NAME_ORDER + " BETWEEN " + currentPosition + " AND " + newPosition,
                null);
}

您可以在代码(不是sqlite)中检测项目从哪个位置移动到哪个其他位置。有了这些信息,您可以创建一个sql语句来增加或减少受影响的位置。我的意思是(伪代码):

用户将项目从位置n移动到位置m

//增量位置
如果(m>n){
//移动其他项目
executeSQL(“更新表格名称集列表位置=列表位置-1,其中列表位置>n,列表位置=m,列表位置
事实上,它可以通过一个查询完成。只需插入
:table
:col
将实际的表名和列名静态写入查询,而
:curpos
:newpos
必须在每次调用时插入(可能像其他答案一样使用字符串连接,或任何您认为合适的方法,例如
java.util.Formatter
实例)

更新:表集:列=
案例
当:列<:curpos时,则:列+1
当:col>时:curpos然后:col-1
其他:newpos
终止
式中:最小值(:curpos,:newpos)和最大值(:curpos,:newpos)之间的列;

编辑:我发现在以前的版本中有一些无用的行…

这里的条目是什么意思。现在我正在尝试使用sqlite DB_浏览器。@1992条目只是一个静态嵌套类,将类名作为静态最终字符串保存并实现BaseColumns。您可以硬编码该列如果你wish@Luke请注意,代码中有一个小错误:当
newPosition
时,
WHERE
条件必须介于“+newPosition+”和”之间+currentPosition
@Dario我手边没有SQLite来测试它,但PostgreSQL查询似乎证实了你的评论。奇怪的是,到目前为止,这似乎工作得很好。无论如何,我在问题中编辑了它,只需按你希望的顺序在SharedReferences中保存字段列表。然后在下次查询中使用该列表。毕竟,谁是在21世纪,是否还要继续使用
选择*
?在同一个应用程序中,我想要一个带滑动的列表视图来显示多个按钮,并将项目拖到任何地方。我尝试过使用单独文件的列表视图,但当我尝试集成文件时,我无法使用。有没有简单的方法通过单个库来解决此问题?老实说,我不知道如果有任何库可以执行此操作,也许。但如果您没有找到任何解决方案,我认为最好问一个新问题。
ContentValues cv = new ContentValues(1);
cv.put(Entry.COLUMN_NAME_ORDER, newPosition);
db.update(TABLE_NAME, cv, Entry.COLUMN_NAME_ID + "=" + id, null);
// increment position
if (m > n) {
    // move other items
    executeSQL("UPDATE table_name SET list_position = list_position-1 WHERE list_position > n AND list_position <= m");
    // move
    executeSQL("UPDATE table_name SET list_position = m WHERE list_position = n");
}
// decrement position
else if (m < n) {
    // move other items
    executeSQL("UPDATE table_name SET list_position = list_position+1 WHERE list_position >= m AND list_position < n");
    // move
    executeSQL("UPDATE table_name SET list_position = m WHERE list_position = n");
}
update :table set :col = 
  case 
    when :col < :curpos then :col + 1
    when :col > :curpos then :col - 1
    else :newpos
  end 
where :col between min(:curpos,:newpos) and max(:curpos,:newpos);