首先,您需要传递
long给delete方法,而 不是
int。其次,您应该将 确切的rowId 传递给您的方法,而 不是
适配器的位置。因为适配器位置将始终是从0到某个数字的连续数字集,并且之间没有间隔,所以在数据库中,从表中删除数据后,某些数字将不用于rowId。例如,如果您删除第5行,则SQLite
db不再使用索引4。您将拥有0、1、2、3、5、6 …这样的行,因为它是自动递增的。
我建议您将数据存储在二维数组或ArrayList中。然后,
COL_1从db检索数据时,也需要将相应的文本也传递给值。这样,您将始终知道哪个行号包含特定数据,并在要删除该行号时显示该行号。
因为只有一列数据,所以很容易为您显示带有二维数组的版本。
您可以将其想象成数组的数组:
mDataset->
在位置:
0 | array1
1 | arrays2
2 | array3
… | …
array1->
在位置:
0 | rowId
1 | textData
array2->
在位置:
0 | rowId
1 | textData
等等。但是您将需要更改用于从db检索数据的方法的代码,以便它将返回上述ArrayList。
代码如下所示:
在您的数据库中:
// getData methodpublic ArrayList<ArrayList<String>> getData() { SQLiteDatabase db=this.getWritableDatabase(); String[] columns = new String[]{COL_1, COL_2}; Cursor c = ourDatabase.query(TABLE_NAME, columns, null, null, null, null, null); int rowId = c.getColumnIndex(COL_1); int text = c.getColumnIndex(COL_2); ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>(); for (c.moveToFirst(); !c.isAfterLast(); c.moveTonext()) { ArrayList<String> temp = new ArrayList<String>(); temp.add(c.getString(rowId)); temp.add(c.getString(text)); data.add(temp); } return data;}// deleteEntry methodpublic boolean deleteEntry(long row) { SQLiteDatabase db=this.getWritableDatabase(); db.delete(TABLE_NAME, COL_1 + "=" + row, null); return true;}数据集:
ArrayList<ArrayList<String>> mDataSet = //initialize or pass data
然后将其用作:
int position = mDataset.get(getAdapterPosition).get(0);boolean isDeleted = myDb.deleteEntry(Long.parseLong(position));
要么
long position = mDataset.get(getAdapterPosition).get(0);boolean isDeleted = myDb.deleteEntry(position);



