gpt4 book ai didi

java - 如何从 SQLite 数据库填充的 ListView 中删除选定的行

转载 作者:行者123 更新时间:2023-12-01 09:49:25 26 4
gpt4 key购买 nike

我使用以下代码从 ListView 中获取所选项目的列表(从 SQLite 数据库填充)。对话框成功显示列表,一切都很好。

    private String getCheckedItems() {

SparseBooleanArray positions = getListView().getCheckedItemPositions();
StringBuilder sb = new StringBuilder();

for (int i = (positions.size() - 1); i >= 0; i--) {

Cursor cursor = (Cursor) getListView().getItemAtPosition(positions.keyAt(i));
if(positions.valueAt(i) == true)
sb.append(Utility.decodeContent("- " + cursor.getString(cursor.getColumnIndex("word")) + "\n"));
}

AlertDialog.Builder builder = new AlertDialog.Builder(
FavBawords2.this);

builder.setTitle((getResources().getString(R.string.HisFav_del_one)));
builder.setIcon(R.drawable.clear);
builder.setMessage(sb);

builder.setPositiveButton((R.string.ok), new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

onPositiveButtonClicked();
}
});

builder.setNegativeButton((R.string.cancel_action), new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
//do something else
}
});

builder.show();

return null;
}

我想选择一个或多个项目来从 ListView 和数据库中删除。以下是删除所选项目的代码:

    protected void onPositiveButtonClicked() {          

SparseBooleanArray positions = getListView().getCheckedItemPositions();

for(int i = 0; i < getListView().getCount(); i++){
Cursor cursor = (Cursor) getListView().getItemAtPosition(positions.keyAt(i));
String str = cursor.getString(cursor.getColumnIndex("word"));
if(positions.valueAt(i) == true) {

if(cursor.moveToFirst()) {
//favitems is my table
db.execSQL("delete from favitems WHERE word ='"+str+"'");

}
}

}
}

遗憾的是,尽管所选项目实际上已被删除,但我收到如下 ArrayIndexOutOfBoundsException 错误。

  06-08 18:01:19.587: W/dalvikvm(18952): threadid=1: uncaught exception occurred
06-08 18:01:19.588: W/System.err(18952): java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
06-08 18:01:19.589: W/System.err(18952): at android.util.SparseBooleanArray.keyAt(SparseBooleanArray.java:176)
06-08 18:01:19.589: W/System.err(18952): at the_app.activity.FavBawords2$ModeCallback.onPositiveButtonClicked(FavBawords2.java:881)
06-08 18:01:19.589: W/System.err(18952): at the_app.activity.FavBawords2$ModeCallback$1.onClick(FavBawords2.java:844)
06-08 18:01:19.589: W/System.err(18952): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
06-08 18:01:19.589: W/System.err(18952): at android.os.Handler.dispatchMessage(Handler.java:110)
06-08 18:01:19.589: W/System.err(18952): at android.os.Looper.loop(Looper.java:193)
06-08 18:01:19.589: W/System.err(18952): at android.app.ActivityThread.main(ActivityThread.java:5292)
06-08 18:01:19.589: W/System.err(18952): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 18:01:19.589: W/System.err(18952): at java.lang.reflect.Method.invoke(Method.java:515)
06-08 18:01:19.589: W/System.err(18952): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
06-08 18:01:19.590: W/System.err(18952): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
06-08 18:01:19.590: W/System.err(18952): at dalvik.system.NativeStart.main(Native Method)
06-08 18:01:19.590: W/dalvikvm(18952): threadid=1: calling UncaughtExceptionHandler
06-08 18:01:19.591: E/AndroidRuntime(18952): FATAL EXCEPTION: main

我猜问题可能出在这一行:

 for(int i = 0; i < getListView().getCount(); i++)

因为当我将其更改为

 for (int i = (positions.size() - 1); i >= 0; i--)  

我不再有这个问题了。但删除失败。我想知道您是否可以帮我解释一下为什么我遇到这样的问题并告诉我解决办法。

非常感谢您的帮助。

最佳答案

你是对的,问题只出现在这一行。 for(int i = 0; i < getListView().getCount(); i++)

原因:因为您正在使用 ListView 的总项目大小,而您可能只选择了其中的少数项目。这就是 ArrayIndexOutOfBoundsException 的原因

像这样编写查询

delete from favitems WHERE word like '"+str+"'"

关于java - 如何从 SQLite 数据库填充的 ListView 中删除选定的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37703076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com