gpt4 book ai didi

java - 在 ListView 中获取长按的内容

转载 作者:行者123 更新时间:2023-11-30 04:37:37 26 4
gpt4 key购买 nike

出于某种原因,我的数据库无法执行 .delete 方法。

我有这张支票:

if(db.delete(clicked)){
Log.i("MainAct.class","Deleted row: " + clicked + " successfully");
} else {
Log.i("MainAct.class","FAILURE Deleting row: " + clicked + " UNsuccessfully");
}

它一直返回“FAILURE”所以我认为这意味着它没有删除

public boolean delete(String row){
open();
Log.i("SmsDatabase.java", "DELETING: " + TABLE_NAME +
" id =? " + "id = '" + row + "'");
return this.db.delete(TABLE_NAME, "id = '" + row + "'", null) > 0;
}

它被称为很好(顺便说一句,open() 方法有一个 if(!db.isOpen()) 所以它并不总是打开我的数据库)但由于某种原因它返回 false。

我试过这个:

return this.db.delete(TABLE_NAME, "id =?", new String[]{row}) > 0;

但在日志中,它会返回奇怪的字符:“[Lstring@406865”(记不太清了)表示单击的字符串。显然这不是我想要的。

为什么要这样做?

最佳答案

我将在我的回答中做出一些假设。 (1) 您希望用户能够选择删除的任何内容的列表都充满了从您要删除的数据库中获得的数据,(2) 您已经在 onCreate 或类似的东西中完成了设置设置 listView 的点击监听器,或 (3) 设置 listview 以注册上下文菜单。我怀疑您只是没有获得要删除的项目的正确 ID。

在我的设置中,我有一个已注册上下文菜单的 ListView ,我使用上下文菜单让他们选择编辑或从列表中删除项目,所以在我的 onCreate 中,我调用 registerForContextMenu(this.listView );在我的上下文菜单中,我有:

   @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
menu.setHeaderTitle("Update Item");
menu.add(Menu.NONE, MENU_EDIT_ITEM, 0, "Edit Item");
menu.add(Menu.NONE, MENU_REMOVE_ITEM, 1, "Remove Item");
}

然后

   @Override
public boolean onContextItemSelected(MenuItem item)
{
return (applyMenuChoice(item) || super.onContextItemSelected(item));
}

然后

   private boolean applyMenuChoice(MenuItem item)
{
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

switch (item.getItemId())
{
case MENU_EDIT_ITEM:
{
// Since the user wants to edit an existing device we need to pass the
// database id of the device - not it's position - to the details screen
long idNum = info.id;
Intent i = new Intent(getApplicationContext(), DeviceDataActivity.class);
i.putExtra(DeviceListViewActivity.ID_EXTRA, String.valueOf(idNum));
startActivityForResult(i, 0);
break;
}
case MENU_REMOVE_ITEM:
{
long idNum = info.id;
deviceDatabaseHelper.deleteItem(String.valueOf(idNum));
initList();
break;
}
default:
{
return false;
}
}
return true;

}// end applyMenuChoice

在我的数据库助手代码中,我调用了以下代码:

   public void deleteItem(String id)
{
SQLiteDatabase db = getWritableDatabase();
db.delete(TABLE_NAME, _ID + "=?", new String[]
{ id });
db.close();
}

获取特定项目的另一个有用功能。请注意,如果记得将 Item/YOUR_ITEM 替换为您的对象,并根据需要使用您的表名 (YOUR_TABLE) 和 BaseColumns._ID 更新查询。

   /**
* Use this method to return a single item object based on it's id
* NOTE - from calling classes id may not be equal to position
* @param id - the ID of the device being requested
* @param db - the database to get it from
* @return YOUR_ITEM - that device associated with the id
*/
public static YOUR_ITEM getById(String id, SQLiteDatabase db)
{
String[] args = { id };
Cursor c = db.rawQuery( "SELECT * FROM YOUR_TABLE WHERE " +
BaseColumns._ID + "=?", args );
c.moveToFirst();
Item result = new Item().loadFrom(c);
c.close();
return (result);
}

我不是一个非常有经验的数据库专家,所以我非常依赖很多示例,这些示例编写了一个数据库帮助程序类(扩展 SQLiteOpenHelper),该类有助于获取数据并将数据放入 SQLiteDataBase。希望这对您有所帮助!

关于java - 在 ListView 中获取长按的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6576653/

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