Android: setListAdapter устанавливает только последнюю строку в базе данных - PullRequest
2 голосов
/ 05 апреля 2011

Как видно из заголовка, у меня возникли небольшие проблемы с привязкой моих данных из базы данных к представлению списка, проблема в том, что адаптер установит только последнюю возвращенную строку, в отличие от каждой строки таблицы базы данных.

Пример того, чего я пытаюсь достичь:

ТАБЛИЦА ЖИВОТНЫХ: Monkey Cat Dog Tiger

будет отображаться как только Tiger на экране.

Мой метод возвращаетсякурсор из базы данных:

public Cursor retrieveAnimals(){

    return = DB.query(ANIMAL_TABLE, new String[] {
            KEY_ROWID,
            KEY_ANIMALNAME,
            },
            null,
            null,
            null,
            null,
            null);      
}

и настройка просмотра списка

    dbm = new MyDBManager(this);
    dbm.open();
    dbm.deleteAnimals();
    dbm.populateDB();

    // after populating, set the adapter..
    myCursor = dbm.getAllAnimals();

String[] columns = new String[] {"animal_name"};
int[] to = new int[] {R.id.animal};

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.row, myCursor, columns, to);
    this.setListAdapter(mAdapter);

У меня есть ощущение, что моя проблема заключается в положении курсора, в том, что он автоматически перемещается в последнюю строку, когданастраивая адаптер, я пытался найти решение своей проблемы, но безуспешно.

Заранее благодарен за любые предложения.

РЕДАКТИРОВАТЬ: Метод для заполнения БД

public long populateDB(){


    ContentValues initialValues = new ContentValues();

    for(int i = 0; i < animalName.length; i++){
        initialValues.put(KEY_ANIMALNAME, animalName[i]);
    }

    return DB.insert(ANIMAL_TABLE, null, initialValues);

}

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Вы пробовали

myCursor.moveToFirst()
1 голос
/ 05 апреля 2011

В вашем retrieveAnimals() строка должна быть return DB.query(...) (обратите внимание на отсутствие = между return и DB.query).

Кроме того, ваш код выглядит нормально. Вы должны вызвать startManagingCursor на курсоре (после вызова getAllAnimals), чтобы избежать утечек памяти.

Редактировать: изменить метод заполнения на:

public long[] populateDB(){


    ContentValues initialValues = new ContentValues();
    long[] rowIds = new long[animalName.length];

    for(int i = 0; i < animalName.length; i++){
        // here we are using a single ContentValues object and inserting it
        // into the DB before changing the ContentValues and inserting it again
        initialValues.put(KEY_ANIMALNAME, animalName[i]);
        rowIds[i] = DB.insert(ANIMAL_TABLE, null, initialValues);
    }

    return rowIds;

}

В качестве альтернативы (больше использования памяти, но, возможно, полезно, если вам нужно изменить некоторые записи перед их вставкой):

public void populateDB(){

    ContentValues[] initialValues = new ContentValues[animalName.length];

    for(int i = 0; i < animalName.length; i++){
        // create a new ContentValues for each object
        initialValues[i] = new ContentValues();
        initialValues[i].put(KEY_ANIMALNAME, animalName[i]);
    }

    // now our contentvalues is filled we can insert them all
    for(int i = 0; i < animalName.length; i++){
        DB.insert(ANIMAL_TABLE, null, initialValues[i]);
    }
}
...