Android:SQLite查询问题

时间:2011-04-24 19:32:01

标签: android sqlite

我有一个包含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,硬编码数字等等。

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

解决方案:

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

5 个答案:

答案 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);
}