我在我的Android应用程序中使用sqlite数据库,我希望我的数据库在用户更改顺序时重新排列行。它应该影响所有其他行,以便我可以按照上次保存的顺序显示数据。
下图显示了我的数据库。如果我将第2行移动到第6位,我的第3行应该是第2行,第4行应该是第3行,依此类推,直到第6行。如何使用查询?
答案 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);
编辑:我发现在之前的版本中有几条无用的线路......