如何正确检索数据?

时间:2017-12-03 21:58:23

标签: android sqlite android-sqlite

我已经完成了一个显示标题的列表,当我点击一个项目时,会打开一个显示该元素描述的活动;我正在使用元素的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});
}

3 个答案:

答案 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。