При выборе всех строк из базы данных Android sqlite для приложения, он возвращает последнюю запись для всех записей - PullRequest
1 голос
/ 29 сентября 2011

Я сейчас работаю над приложением для Android. У меня есть база данных sqlite, которая хранит текст (который я просто использую как строки в своем приложении) в четырех столбцах. Я пытаюсь вернуть все строки и столбцы из таблицы. Я создал и вставил данные в таблицу и убедился, что они есть с помощью sqlite3 из оболочки adb. Я использую тот же оператор, что и в своей программе, и он возвращает все строки со всеми правильными данными. В моей программе я храню все данные в формате ArrayList<ArrayList<String>>, перебирая курсор. Он возвращает правильное число ArrayList<String>, соответствующее строкам, но все они имеют информацию только из последней строки. Вот мой код:

private static final String SELECT = "SELECT * FROM " + TABLE_NAME;

public ArrayList<ArrayList<String>> allRecipes()
{
    ArrayList<ArrayList<String>> results = new ArrayList<ArrayList<String>>();
    ArrayList<String> recipe = new ArrayList<String>();
    Cursor cursor = db.rawQuery(SELECT, null);
    if(cursor.moveToFirst())
    {
        do
        {
            recipe.clear();
            recipe.add(cursor.getString(1));
            recipe.add(cursor.getString(2));
            recipe.add(cursor.getString(3));
            recipe.add(cursor.getString(4));
            results.add(recipe);
        }while(cursor.moveToNext());
        if(cursor != null && !cursor.isClosed())
            cursor.close();
    }
    return results;
}

Затем я перебираю ArrayLists в другой части моей программы, и вся содержащаяся информация представляет собой просто дубликаты последней строки, введенной в таблицу. Я проверил ArrayLists в моем другом методе, как только он его получил, и они все одинаковые, поэтому я предполагаю, что это должно быть проблемой в этом сегменте кода. Я также пробовал оператор select с group by и order by, и он все еще не работает. Использование db.query () с правильными параметрами также вызывает те же проблемы.

1 Ответ

0 голосов
/ 29 сентября 2011

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

Вы должны изменить код на этот

public ArrayList<ArrayList<String>> allRecipes()
{
   ArrayList<ArrayList<String>> results = new ArrayList<ArrayList<String>>();
   Cursor cursor = db.rawQuery(SELECT, null);
   if(cursor.moveToFirst())
   {
       do
       {
           ArrayList<String> recipe = new ArrayList<String>();
           recipe.add(cursor.getString(1));
           recipe.add(cursor.getString(2));
           recipe.add(cursor.getString(3));
           recipe.add(cursor.getString(4));
           results.add(recipe);
       }while(cursor.moveToNext());
       if(cursor != null && !cursor.isClosed())
          cursor.close();
   }
   return results;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...