Android:SQLite查询的问题

Android:SQLite查询的问题,android,sqlite,Android,Sqlite,我有一个包含动物表的数据库,其中有_id、name和传记列 我试图根据用户从列表中选择的动物来查询数据库中的特定传记,问题是光标将只返回数据库中的第一本传记,或者根本不返回 如果有人能看到问题所在,或者提出一些有用的建议,我将不胜感激 // Code for obtaining position protected void onListItemClick(ListView l, View v, int position, long id){ Intent animalInte

我有一个包含动物表的数据库,其中有_id、name和传记列

我试图根据用户从列表中选择的动物来查询数据库中的特定传记,问题是光标将只返回数据库中的第一本传记,或者根本不返回

如果有人能看到问题所在,或者提出一些有用的建议,我将不胜感激

 // Code for obtaining position
protected void onListItemClick(ListView l, View v, int position, long id){
        Intent animalIntent = new Intent(this, Animal.class);
        animalIntent.putExtra("pos", position);
        startActivity(animalIntent);    
    }
//在数据库中查询bio,其中,按列表中项目的位置查询KEY_ROWID。 myCursor=dbm.getBioposition

    if(myCursor.moveToFirst()){

    // querying the cusor, retrieve in index of column BIOGRAPHY, store as column index.
        int bio_index = myCursor.getColumnIndexOrThrow(MyDBManager.KEY_BIOGRAPHY);

        // return the string from the cursor @ column index
    String bio = myCursor.getString(bio_index);

    // find textview 
        animalBio = (TextView)findViewById(R.id.bio);

        // Set textView to value of string returned from myCursor @ bio_index
    animalBio.setText(bio);
    }
//此方法将始终返回数据库中存储的第一个值 公共游标getBioint位置{

    return qmDB.query(ANIMAL_TABLE, new String[]{
            KEY_ROWID,
            KEY_BIOGRAPHY,
            },
            KEY_ROWID,
            null,
            null,
            null,
            null);
}
我尝试过其他变体,如KEY_ROWID=+=position、KEY_ROWID=?、将位置转换为字符串、将位置作为long类型传入、硬编码数字等

所以你看,我觉得问题在于查询语句,它只是不返回第一行以外的任何其他行,或者如果返回,它就不会显示

解决方案:


请记住在应用程序上更新数据库。

就像在JDBC结果集中一样,您需要调用“moveToNext”方法来移动光标。例如:

while(myCursor.moveToNext()){
   bio = myCursor.getString(bio_index);
   // etc...
}
游标JavaDoc:

公共抽象布尔moveToNext

自:API级别1

将光标移动到 下一行。此方法将返回 如果光标已过,则为false 结果集中的最后一项

返回:移动是否成功


这样做:

Cursor c=null;
c=;
try {
if (c!=null) {
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

}

}
} finally {
if (c!=null) {
c.close();
}
}

我认为问题在于您进行sql查询的方式

public Cursor getBio(int position) {
    return qmDB.query(ANIMAL_TABLE, new String[]{KEY_ROWID,KEY_BIOGRAPHY}, "KEY_ROWID=?",  new String[]{ position }, null, null, null);
}

这可能看起来有侮辱性,但请使用sqlitebrowser并确保您的唯一id确实是唯一的。也许您忘记了自动递增?您当前的代码看起来很好。

由于您说您有一个列表,我假设您使用的是onListItemClick方法。因此,根据用户单击的项目,根据您的表获取名称位置1

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Cursor o = (Cursor) this.getListAdapter().getItem(position);
        dbm.getBio(o.getString(1));
    }
在我看来,您使用该职位的查询是有缺陷的。这就是我认为您希望在getBio方法中执行的操作:

public Cursor getBio(String name) {
    return this.dbm.query(ANIMAL_TABLE, new String[]{KEY_BIOGRAPHY},"name='" + name + "'", null, null, null, null);
}

你好,Vicente,没有必要使用moveToNext,因为我只想返回所选特定动物的单个生物。应用程序的流程如下:动物列表->动物页面,包括图片,以及“传记”和“后退”按钮->动物传记页面。所以你看,我根据动物在列表中的位置查询数据库。我是u使用此位置映射到表中的_ID字段并返回相应的传记。明白了。我们可以查看您的列表处理程序吗?By listHandler您是在谈论列表活动吗?我运行了一个测试,以查看是否正确传递了正确的位置,结果是否正常。然后我认为您应该检查键_ROWID是否指向相应的列。这应该不会影响结果,但谁知道使用第四个参数,就像resultset中的setParameter一样,您也可以在这里使用问号。我还认为您的示例代码中缺少了一些内容,因为数组在逗号后立即关闭,因为这不是一个有效的Java语法。嗨,Pentium,我已经尝试用是代码,它不起作用!我可以访问数据库没有问题,它会向我返回信息。我只是觉得问题与列表项的行id和位置有关。我们没有位置信息。如果我的直觉正确,可能是一个序列号,可能来自选择列表。你需要跳转r适配器到该位置,检索该位置记录的唯一id,并传递唯一id而不是位置。您的直觉是正确的,但是我没有使用适配器,而是使用上面的代码返回光标,检索传记的列索引,并将textView设置为传记的值。可以这样做吗是这样的吗?如前所述,我们不知道位置从何处得到什么值。但这可能不是唯一的id,在这种情况下,您需要使用限制偏移量1语法,从一开始就跳过X行。该语法中的位置将是偏移量,第一行为零。希望这有帮助。请提供代码为了获得职位?当然佩卡,我已经用代码更新了原来的帖子,还有一些关于我如何处理这个问题的新解释。我已经设法解决了这个问题,因为事实证明我没有更新数据库。4天和无数个小时的挫折,不会忘记这一点的…感谢大家的帮助dvice.Hi Raunak,谢谢你的建议,我已经尝试过这种方法,但不幸的是它没有起作用!Hi Ian,我的create语句包含了一个自动递增,我知道列表中有不止一行,因为同一个表中有很多动物。我想你编辑了你的查询方法。第三个参数应该是KEY_ROWID+=+位置,除非使用?标记语法
是的,你说得对!我的查询一点问题都没有,原来整个问题都是基于数据库的..grr.hm,那么请在回答中给出您的解决方案来结束这篇文章。