Android:无法从 ListView 和 SQLite 中删除记录

Posted

技术标签:

【中文标题】Android:无法从 ListView 和 SQLite 中删除记录【英文标题】:Android: Can't delete record from ListView and SQLite 【发布时间】:2013-10-06 19:23:12 【问题描述】:

我尝试了几种方法从列表视图中删除记录长按项目,但是,没有任何反应,没有错误,没有删除什么,只是吐司出现...... 代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    overridePendingTransition(R.layout.push_left_in, R.layout.push_left_out);
    setContentView(R.layout.moje_ure);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    datasource = new VnosiDataSource(this);
    datasource.open();


    final List<VnosiDB> values = datasource.getAllDela();
    final ArrayAdapter<VnosiDB> adapter = new ArrayAdapter<VnosiDB>(this,
        android.R.layout.simple_list_item_1, values);
    setListAdapter(adapter);
    ListView ureList = getListView();
    adapter.notifyDataSetChanged();
    ureList.setOnItemClickListener(new OnItemClickListener() 

        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int pos,
            long id) 
            // TODO Auto-generated method stub

            //some code here...

            String posit = values.get(pos).toString();
            Toast.makeText(Ure.this, posit, Toast.LENGTH_SHORT).show();
        
    );
    ureList.setOnItemLongClickListener(new OnItemLongClickListener() 

    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View view,
            int pos, long id) 
        // TODO Auto-generated method stub

        datasource.deleteVnos((int)values.get(pos).getId());
        Toast.makeText(Ure.this, "Vnos " + values.get(pos).toString() + " izbrisan!", Toast.LENGTH_SHORT).show();
        adapter.notifyDataSetChanged();
        return true;
    
);

以及数据库的删除方法:

public void deleteVnos(int _id)

    database.delete(DatabaseManidzer.TABLE_VNOSI, DatabaseManidzer.COLUMN_ID + " = " + _id, null);
 

public void open() throws SQLException 
    database = dbHelper.getWritableDatabase();

更新:在类 VnosiDataSource.java 中填充列表视图的方法:

    public List<VnosiDB> getAllDela() 

    List<VnosiDB> dela = new ArrayList<VnosiDB>();

    Cursor cursor = database.rawQuery(
            "SELECT delo from vnosi ORDER BY vnos DESC", null);

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) 
        VnosiDB curdela = cursorToDela(cursor);
        dela.add(curdela);
        cursor.moveToNext();
    
    // Make sure to close the cursor
    cursor.close();
    return dela;

我错过了什么?

【问题讨论】:

【参考方案1】:

删除项目后需要重新查询数据库。获得结果后,再次使用结果设置适配器。

@Override
protected void onCreate(Bundle savedInstanceState) 
  ....
updateListView();
ureList.setOnItemClickListener(new OnItemClickListener() 

    @Override
    public void onItemClick(AdapterView<?> arg0, View view, int pos,
        long id) 
        // TODO Auto-generated method stub

        //some code here...

        String posit = values.get(pos).toString();
        Toast.makeText(Ure.this, posit, Toast.LENGTH_SHORT).show();
    
 );
ureList.setOnItemLongClickListener(new OnItemLongClickListener() 

  @Override
  public boolean onItemLongClick(AdapterView<?> arg0, View view,
        int pos, long id) 
    VnosiDB item = (VnosiDB) getListAdapter().getItem(pos);
    int itemId = item.getId();
    datasource.deleteVnos(itemId);
    Toast.makeText(Ure.this, "Vnos " + item.toString() + " izbrisan!", Toast.LENGTH_SHORT).show();
    updateListView();
    return true;
  
);

public void updateListView() 
    final List<VnosiDB> values = datasource.getAllDela();
    final ArrayAdapter<VnosiDB> adapter = new ArrayAdapter<VnosiDB>(this,
       android.R.layout.simple_list_item_1, values);
    setListAdapter(adapter);


public void deleteVnos(long itemId)
  database.delete(DatabaseManidzer.TABLE_VNOSI, "_id = ?", new String[]Long.toString(itemId));
 

更新 当您在数据库中查询您的项目时,您没有选择 _id。我不确定你在 cursorToDela(cursor) 中做了什么,但你没有 _id 在该光标中填充 curdela.getId() 返回的内容;

public List<VnosiDB> getAllDela() 

  List<VnosiDB> dela = new ArrayList<VnosiDB>();

  Cursor cursor = database.rawQuery(
        "SELECT _id, delo from vnosi ORDER BY vnos DESC", null);

  while (cursor.moveToFirst())
    //cursorToDela needs to grab the _id from the cursor and set it on the created VnosiDB.
    VnosiDB curdela = cursorToDela(cursor);
    dela.add(curdela);
  
  // Make sure to close the cursor
  cursor.close();
  return dela;

【讨论】:

谢谢,但它仍然不起作用......和以前一样:我得到了祝酒词,但列表视图或数据库没有任何反应...... DatabaseManidzer.COLUMN_ID = "_id"? 我用 deleteVnos 方法更新了我的答案,应该可以解决您的问题。唯一可能出错的是表名,或者当您尝试删除它时,该 ID 在数据库中没有项目。如果此解决方案不起作用,作为测试,请尝试在删除该项目之前查询数据库以确保它存在并且您可以通过该 ID 访问它。 你好 DroidT,这并没有解决问题。据我所知,如果我用 Toast 打印 itemId,我会为所有具有相同名称的列表条目获得相同的 id(我将日期显示为创建的条目的字符串,并且用户显然可以为一天...)。所以我看到的问题是,我无法从列表视图项单击中获取数据库条目 ID(对于具有相同名称的条目,总是获得相同的 ID)。有什么想法吗? 查看我的问题中更新的填充列表视图的方法【参考方案2】:

db.delete 需要 3 个参数 - 这来自参考

public int delete(String table, String whereClause, String[] whereArgs)

所以你的代码应该是这样的:

   db.delete(TableName, "Id=?" ,
      new String[]  Id.toString() );

【讨论】:

它仍然无法工作...和以前一样:我得到了祝酒词,但列表视图或数据库没有任何反应... 您正在从数据库中删除行,而不是从适配器绑定到的列表(值)中。您必须从值中删除该项目或在删除后重建值。 是的,我已经用 DroidT 回答了。我还有另一个活动显示数据库中的一些内容,所以我可以验证内容也没有从数据库中删除......有什么想法吗?

以上是关于Android:无法从 ListView 和 SQLite 中删除记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从android的listview中删除一个项目

无法从 Firebase 将数据显示为 ListView

在使用Baseadapter的Listview中,Android Plus和Minus按钮无法正常工作

Android:Endless Scrolling listview 内容错误和 NullpointerException

android listview 不更新

Android ListView - onListItemClick 无法正常工作