我无法在SQLite中删除id中的某些行

时间:2017-10-17 12:22:09

标签: java android sqlite android-sqlite

我总是无法删除前两个有时三个记录。它们在Listview上,当您按下元素时,您将在另一个布局上看到删除按钮。在Log im中获取每个元素的正确索引。

所以这是我的代码:

主要活动:

        viewOfT.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Intent i=new Intent(MainActivity.this, popupWindow.class);
                i.putExtra("index",id);
                startActivity(i);
            }
        });         
}

public void populateListView() {


    Cursor data = db.getData();
    ArrayList<String> listData = new ArrayList<>();
    while(data.moveToNext()){


               k.setId(data.getInt(0));
               k.setTask(data.getString(1));

        listData.add("- " + k.getTask());


    }

    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_1,
            listData);

    viewOfT.setAdapter(arrayAdapter);
    arrayAdapter.notifyDataSetChanged();
    viewOfT.invalidateViews();

其他活动中的删除按钮:

  del.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        Bundle bundle=getIntent().getExtras();
        long value=bundle.getLong("index");

        db.deleteRecord(value);

        finish(); }
});

和SQLHelper:

public void deleteRecord(long id) {
    SQLiteDatabase db = this.getWritableDatabase();

    db.delete(TABLE_NAME, KEY_ID + "=" + id, null);
    close();
}

1 个答案:

答案 0 :(得分:1)

1)删除populateListView方法

2)将以下内容添加为类变量: -

SimpleCursorAdpater sca;
Cursor data;

3)在onCreate方法中添加: -

data = getData();
sca = new SimpleCursorAdapter(
    this,        // Context same as for array adapter
    android.R.layout.simple_list_item_1, // layout to be used
    data, // <<<<<<<< the cursor to be used for the list
    new String[]{"columnname_to_be_displayed"}, // <<<<<<<< cursor column to display name
    new int[android.R.id.text1], // the view into which the cursor data will be placed
    0 // a flag 0 is fine
);

viewOfT.setAdapter(arrayAdapter);

4)添加一个新方法来覆盖&#39; onResume&#39;方法(或者如果已经被覆盖则改变它): -

@Override
protected void onResume() {
    super.onResume();
    data = getData();
    sca.swapCursor(); // can you sca.notifyDatasetChanged()
}
  • 当您调用另一个要删除任务的活动时,将从其他活动返回时调用onResume,以便再次从数据库中检索数据(删除的行将不存在),并告知adpater刷新数据。

理想情况下,您还应覆盖onDestroy()方法以关闭游标(data.close();)

重要考虑因素

CursorAdapters必须存在一个名为 _id 的游标列(以及SimpleCursorAdapter如何知道传递给onItemClickListener 的内容)。

如果 KEY_ID 不等于 _id ;您需要将KEY_ID更改为 _id 或修改getData()方法以包含_id列(应该是行标识符的值),例如假设一个非常基本的查询:

public Cursor getData() {
    return db.query(TABLE_NAME,"rowid AS _id, *",null,null,null,null,null);
} // Note! will add an extra column so beware if using column offsets

或者也许: -

public Cursor getData() {
    return db.query(TABLE_NAME,KEY_ID + " AS _id, *",null,null,null,null,null);
} // Note! will add an extra column so beware if using column offsets

有关列偏移的说明

在您的代码中,您有: -

           k.setId(data.getInt(0));
           k.setTask(data.getString(1));

0和1是列偏移(并且可以改变例如两个替代的getData()方法)。因此,通常更好地利用Cursor方法getColumnIndex(columnname),例如以上可能是: -

           k.setId(data.getInt(data.getColumnIndex(KEY_ID));
           k.setTask(data.getString(data.getColumnIndex("TASK_COLUMN")));

请注意!并不是你需要创建一个Array,因为SimpleCursorAdpater将光标作为源。 (KEY_ID可能必须以DatabaseHelper类作为前缀)。