我已经完成了一个显示标题的列表,当我点击一个项目时,会打开一个显示该元素描述的活动;我正在使用元素的id获得此描述。
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String descrizione=mydb.getDescription(id+1,titolo.getText().toString());
}
这是我数据库中的方法:
public String getDescription(long id,String formulario)
{
String descrizione="NADA";
SQLiteDatabase db= this.getReadableDatabase();
Cursor res = db.rawQuery( "select * from "+formulario+" where id="+id+"", null );
if(res!=null && res.getCount()>0){
res.moveToFirst();
descrizione = res.getString(res.getColumnIndex("Descrizione"));
res.close();
}
return descrizione;
}
问题:当我删除元素时,所有描述结果都向前移动。我不知道问题是光标,项目的id获取还是删除方法......任何帮助都是有价值的
这是我的删除方法:
public Integer deleteFormula (String formula, String formulario)
{
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(formulario, "Formule = ? ", new String[] { formula});
}
答案 0 :(得分:0)
首先,当您想在ListView中显示数据库数据时,您应该使用CursorAdapter将数据库数据与ListView绑定。从您发布的代码中,无法判断它是否以及如何实现。如果您对此有任何疑问,我建议您查看本文,该文章很好地解释了这个主题https://github.com/codepath/android_guides/wiki/Populating-a-ListView-with-a-CursorAdapter
其次,当您成功将数据绑定到ListView时,在onItemClick方法中,您可以使用第二个参数View,它表示单击的ListView行,以检索该行中显示的数据。
第三,当您从数据库表中删除一行时,您应该通过获取新游标并使用新游标作为参数调用CursorAdapter changeCursor方法来同步ListView。
这只是一个粗略的草图,但我希望它至少会有所帮助。
答案 1 :(得分:0)
您的问题是使用职位来确定< - >
中的 id String descrizione=mydb.getDescription(id+1,titolo.getText().toString());
首先,假设插入3列: -
第一列的id为1,2nd 2和3rd 3.所以最初如果行按照id排序(很有可能发生这种情况但不保证)那么位置0(显示的第一行)+ 1将显示数据对于id 1,position(列表中的第2项)1将显示id 2等的数据,并且看起来都很好。
但是如果你删除id 2,那么: -
列表中的第1项将显示来自id 1的数据,而位置0仍然等于id 1.
但是,列表中的第二项将显示行ID为3的数据,但位置1 + 1 = 2,因此计算出错误的ID。
简而言之,您无法使用position来关联id。
你需要以某种方式获得适当的行。也许最简单的解决方案是使用CursorAdapater,然后id将是id(列名必须是 _id )。
答案 2 :(得分:0)
光标适配器将是最佳解决方案。但是,如果要在从数据库表中删除行时坚持使用相同的代码,则必须确保从数据库中获取更新的数据列表。
此外,您无需在此代码中添加+ 1。如果你必须加+ 1,那就意味着你做错了。
String descrizione=mydb.getDescription(id+1,titolo.getText().toString());
如果您只是在发生更改时不断使用数据库中的数据更新列表,这将很有效,而id不代表databaseID,因为它代表适配器中视图的ID。