我有一个包含Animal表的数据库,其中包含_id,name,tradition。
的列我试图根据用户选择的动物(从列表中)查询数据库中的特定传记,问题是光标只返回数据库中的第一个传记,或者根本没有。
任何人都可以看到问题所在或提供一些有用的建议,我将非常感激。
// 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由列表中项目的“position”查询。 myCursor = dbm.getBio(position);
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);
}
//此方法将始终返回存储在数据库中的数据库传记中存储的第一个值 public Cursor getBio(int position){
return qmDB.query(ANIMAL_TABLE, new String[]{
KEY_ROWID,
KEY_BIOGRAPHY,
},
KEY_ROWID,
null,
null,
null,
null);
}
我尝试了其他变体,例如KEY_ROWID =“+”= position,KEY_ROWID =“?”,将位置转换为字符串,传入位置类型为long,硬编码数字等等。
所以你看到我觉得问题出在查询语句中,它只是没有返回除第一行之外的任何其他行,或者如果它没有,它就不会显示!
解决方案:
请记住在应用程序上更新数据库。
答案 0 :(得分:0)
在JDBC ResultSet中,您需要调用'moveToNext()'方法来移动光标。例如:
while(myCursor.moveToNext()){
bio = myCursor.getString(bio_index);
// etc...
}
Cursor JavaDoc:http://developer.android.com/reference/android/database/Cursor.html
public abstract boolean moveToNext()
自:API Level 1
将光标移动到 下一行。这个方法会返回 如果光标已经过去,则返回false 结果集中的最后一个条目。
返回:移动是否成功
答案 1 :(得分:0)
做这样的事情:
Cursor c=null;
c=;
try {
if (c!=null) {
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
}
}
} finally {
if (c!=null) {
c.close();
}
}
答案 2 :(得分:0)
我认为问题在于你进行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);
}
答案 3 :(得分:0)
这可能看起来很侮辱但是使用sqlitebrowser并确保你的唯一ID真的是唯一的(也许你忘了自动增量?)你的代码看起来很好。
答案 4 :(得分:0)
既然你说你有一个列表,我假设你正在使用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);
}