【发布时间】:2013-02-25 16:19:38
【问题描述】:
想象一下这是我的数据库的快速模型:
数据库中的项目按列表呈现给用户,每个列表显示在一个新片段上,这些片段显示在视图页面上。因此,假设在这种假设情况下,viewpager 上有两个片段,第一个片段将显示 first_list,第二个片段将显示 second_list。这是该查询的代码:
public static Cursor getListItems (final Context context, String listName) {
if (mDatabase == null || !mDatabase.isOpen())
open(context); //This gets the writable db.
String where = LIST_NAME + " = '" + listName + "'";
return mDatabase.query(TABLE_LIST_ITEMS, PROJECTION_LIST_ITEMS,
where, null, null, null, SORT_ORDER);
}
其中SORT_ORDER 是order_in_list,这很好用,首先。
现在,列表视图可以使用公共library 重新排列,它试图允许用户控制每个列表中项目的顺序。这是我遇到问题的地方,光标没有add(int index, Object object),或者其他一些简单的方法来管理排序。我首先认为我可以简单地调用mDatabase.update() 来更改order_in_list 的值,但这可行,但结果并不如预期。例如,用户将 item two 拖动到 zero 的位置,记住:零索引值,我们现在将有 two 个带有 order_in_list 的项目零。尽管我可以在 item one 上调用 mDatabase.update() 将他的位置更新为 one,但想象一下在格式良好的数据库中处理多个项目需要做多少工作.
有人对我如何解决这个问题有什么好的建议吗?我认为我通过添加额外的 col 来进行排序很聪明:(
INB4:
是的,我知道数组可以很好地处理这个问题。但该数据库不仅存储 4 个列,它还有更多字段。每次从数据库中填充数组都是浪费时间和精力。无论如何,我必须在应用程序关闭时写回数据库。
编辑 所以我将列表视图更改为仅显示一个文本字符串,并在实际单击项目时显示更多列(因此显示具有指定列表项数据的新片段)。这让我可以简单地保留一个 ArrayAdapter 来轻松处理拖放操作。在 onStop 期间,我仅在需要保存更改时才更新引用:
@Override
public void onStop() {
if (updateDbOnExit) {
//Update rows on database.
for (int i = 0; i < items.size(); i++) {
//Set the order in list be the actual order on the array.
Constants.LogMessage("Updating db content");
DbManager.moveListItemTo(getActivity(), items.get(i), i);
}
updateDbOnExit = false;
}
super.onStop();
}
MoveListItemTo 更新 order_in_list 的值:
public static void moveTaskItemTo (final Context context, String item, int to) {
if (mDatabase == null || !mDatabase.isOpen())
open(context);
String where = COL_CONTENT + " = '" + item+ "'";
ContentValues mContentValues = new ContentValues();
mContentValues.put(ORDER_IN_LIST, to);
int rows = mDatabase.update(TABLE_LIST_ITEMS, mContentValues, where, null);
Constants.LogMessage(rows + " row updated. Item moved to position: " + to);
close();
}
现在可以了。但是,我仍然想知道是否有其他方法,尤其是当适配器使用数据库中多个 one 列中的数据时,因此需要使用 CusorAdapter 和不是常规的 ArrayAdapter,而后者又需要 Database 本身在每次拖放时更新,以通过 cursorAdapter.swapCursor() 在 UI 上反映更改。如前所述,每次拖动时更新ALL数据库中的项目(顺便说一句,实际上并不经常发生)是昂贵的,只更新两行,将是一个更明智的选择。
【问题讨论】:
-
Where SORT_ORDER is order_in_list...。 Order_in_List 列,如果在后端查询中使用,将是“.... order by order_in_list”? -
不确定后端查询是什么意思。但在我的查询中,我将“order_in_list”作为查询方法的“order by”参数传递。