Android: проблема с запросом SQLite - PullRequest
1 голос
/ 24 апреля 2011

У меня есть база данных, содержащая таблицу Animal, со столбцами для _id, name, biography.

Я пытаюсь запросить в базе данных конкретную биографию в зависимости от животного, выбранного пользователем (из списка), проблема в том, что курсор вернет только первую биографию в базе данных или вообще не вернет ее.

Может кто-нибудь увидеть, в чем может быть проблема, или предложить несколько полезных советов, я был бы очень признателен.

 // 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);    
    }

// запрашиваем базу данных для био, где KEY_ROWID запрашивается «позицией» элемента в списке. 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);
    }

// Этот метод всегда возвращает первое значение, сохраненное в базе данных, биография, хранящаяся в базе данных. общедоступный курсор 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 голосов
/ 25 апреля 2011

Поскольку вы сказали, что у вас есть список, я предполагаю, что вы используете метод 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);
}
0 голосов
/ 25 апреля 2011

Это может показаться оскорбительным, но используйте sqlitebrowser и убедитесь, что ваши уникальные идентификаторы действительно уникальны (возможно, вы забыли автоинкремент?) Ваш код выглядит нормально.

0 голосов
/ 24 апреля 2011

сделать что-то вроде этого:

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

}

}
} finally {
if (c!=null) {
c.close();
}
}
0 голосов
/ 25 апреля 2011

Я думаю, что проблема заключается в том, как вы делаете 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);
}
0 голосов
/ 24 апреля 2011

Как и в ResultSet JDBC, вам нужно вызвать метод 'moveToNext ()' для перемещения курсора.Пример:

while(myCursor.moveToNext()){
   bio = myCursor.getString(bio_index);
   // etc...
}

Курсор JavaDoc: http://developer.android.com/reference/android/database/Cursor.html

public abstract boolean moveToNext ()

С: Уровень API 1

Moveкурсор на следующую строку.Этот метод возвращает false, если курсор уже находится за последней записью в наборе результатов.

Возвращает: успешно ли было перемещение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...