dan*_*c05 2 database sqlite android
所以想象一下这是我的数据库的快速模型:

数据库中的项目按列表呈现给用户,每个列表都显示在一个新片段上,这些片段显示在视图页面上。因此,假设在这种假设情况下,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);
}
Run Code Online (Sandbox Code Playgroud)
哪里SORT_ORDER是order_in_list,这个效果很好,与开始。
现在,列表视图可以使用 public library重新排列,它试图允许用户控制每个列表中项目的顺序。这是我遇到问题的地方,没有add(int index, Object object)光标,或者其他一些管理排序的简单方法。我一开始以为我可以简单地调用mDatabase.update()更改值,order_in_list但这有效,但结果并不如预期。例如,用户将第二项拖动到零位置,请记住:零索引值,我们现在有两个order_in_list为零的项目。虽然我可以叫mDatabase.update()上项目一个更新他的位置,一个,想象一下在一个格式良好的数据库上处理几个项目需要多少工作。
有没有人对我如何解决这个问题有什么好的建议?我认为通过添加额外的 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();
}
Run Code Online (Sandbox Code Playgroud)
其中 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();
}
Run Code Online (Sandbox Code Playgroud)
这将暂时起作用。然而,我仍然上知道,如果有一种替代方法,尤其是当例如,适配器是使用来自多于数据感兴趣一个数据库上的列,并且因此需要使用CusorAdapter和不是正规ArrayAdapter,其在turn 要求数据库本身在每次拖放时更新,以通过cursorAdapter.swapCursor(). 如前所述,在每次拖动时更新数据库中的所有项目(顺便说一句,这实际上并不经常发生)是昂贵的,只更新两行,将是一个更明智的选择。
I just meant I wanted a more effective way to update the fields in the db, rather than manually updating each and every single row
使用户指定的顺序列成为小数,而不是整数。然后您只需要更新移动的行。
允许负数。
0.00 cat
1.00 aardvark
2.00 wolf
3.00 dog
Run Code Online (Sandbox Code Playgroud)
如果将“dog”拖到“wolf”上方,则“dog”变为 1.50,无需更改其他行。如果将“aardvark”拖到“cat”上方(特殊情况——在列表前面而不是在行之间插入),则从最上面的值中减去 1,“aardvark”变为 -1.00。
这将要求您知道相邻行的值,但您不必更新它们。只有移动行的值必须更改。