Android:SQLite查询的问题
我有一个包含动物表的数据库,其中有_id、name和传记列 我试图根据用户从列表中选择的动物来查询数据库中的特定传记,问题是光标将只返回数据库中的第一本传记,或者根本不返回 如果有人能看到问题所在,或者提出一些有用的建议,我将不胜感激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
// 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,那么请在回答中给出您的解决方案来结束这篇文章。