Sqlite db重新排列行

时间:2017-01-27 12:22:17

标签: android database sqlite android-sqlite

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

下图显示了我的数据库。如果我将第2行移动到第6位,我的第3行应该是第2行,第4行应该是第3行,依此类推,直到第6行。如何使用查询?

screenshot

3 个答案:

答案 0 :(得分:1)

这是我在数据库中用于类似内容的片段:

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);
}

它改变了currentPosition和newPosition之间每个条目的顺序,if和else if if在哪个方向上的唯一区别,即+1或-1。我不确定是否有更好的处理方法,但到目前为止这对我有用。

最后移动所需的项目:

ContentValues cv = new ContentValues(1);
cv.put(Entry.COLUMN_NAME_ORDER, newPosition);
db.update(TABLE_NAME, cv, Entry.COLUMN_NAME_ID + "=" + id, null);

答案 1 :(得分:1)

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

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

// 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");
}

答案 2 :(得分:0)

实际上,可以使用单个查询完成。只需插入:table:col将实际的表名和列名静态写入查询,而:curpos:newpos必须在每次调用时进行插值(可能使用字符串连接)和其他答案一样,或者你认为合适的任何答案,例如java.util.Formatter实例)

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);

编辑:我发现在之前的版本中有几条无用的线路......