2014-06-28 5 views
1

Я пытаюсь получить данные из базы данных на Sqlite. сначала вставьте строки и вставьте их в String [], затем вставьте String [] в arraylist и, наконец, верните arraylist, чтобы использовать его в другом классе.Arraylist of String Arrays issue

public ArrayList<String[]> getWeekUni() { 
    SQLiteDatabase db = helper.getWritableDatabase(); 

    String[] columns = { MenuDataBase.SOPA, MenuDataBase.FONDO1, 
      MenuDataBase.REFRESCO, MenuDataBase.CALORIAS, }; 

    ArrayList<String[]> weekdays = new ArrayList<String[]>(); 

    String[] rowDay = new String[4]; 

    Cursor cursor = db.query(MenuDataBase.TABLE_UNI, columns, null, null, 
      null, null, null); 

    while (cursor.moveToNext()) { 
     cursor.moveToNext(); 
     int index1 = cursor.getColumnIndex(MenuDataBase.SOPA); 
     int index2 = cursor.getColumnIndex(MenuDataBase.FONDO1); 
     int index3 = cursor.getColumnIndex(MenuDataBase.REFRESCO); 
     int index4 = cursor.getColumnIndex(MenuDataBase.CALORIAS); 
     rowDay[0] = cursor.getString(index1); 
     rowDay[1] = cursor.getString(index2); 
     rowDay[2] = cursor.getString(index3); 
     rowDay[3] = cursor.getString(index4); 

     Log.d("TEST", rowDay[0]+" Get week"); 
      Log.d("TEST", rowDay[1]+" Get week"); 

     int i = 0; 
     weekdays.add(rowDay); 

     Log.d("TEST",Integer.toString(weekdays.size())); 
     Log.d("TEST", weekdays.get(i)[0].toString()); 
     Log.d("TEST", weekdays.get(i)[1].toString()); 
     i++; 
    } 

    Log.d("TEST", weekdays.get(0)[0].toString()+" weekdays"); 
    Log.d("TEST", weekdays.get(0)[1].toString()+" weekdays"); 
    Log.d("TEST", weekdays.get(3)[0].toString()+" weekdays"); 
    Log.d("TEST", weekdays.get(3)[1].toString()+" weekdays"); 

    db.close(); 
    return weekdays; 
} 

И мой журнал кот это:

06-28 10:54:44.160: D/TEST(13577): Semola Get week 
06-28 10:54:44.160: D/TEST(13577): Garbanzos a la Americana Get week 
06-28 10:54:44.160: D/TEST(13577): 1 
06-28 10:54:44.160: D/TEST(13577): Semola 
06-28 10:54:44.160: D/TEST(13577): Garbanzos a la Americana 
06-28 10:54:44.160: D/TEST(13577): Juliana Get week 
06-28 10:54:44.160: D/TEST(13577): Aeropuerto Get week 
06-28 10:54:44.160: D/TEST(13577): 2 
06-28 10:54:44.160: D/TEST(13577): Juliana 
06-28 10:54:44.160: D/TEST(13577): Aeropuerto 
06-28 10:54:44.160: D/TEST(13577): Chupe de Carne Get week 
06-28 10:54:44.160: D/TEST(13577): Ajiaco con Hamburguesa de Casa Get week 
06-28 10:54:44.160: D/TEST(13577): 3 
06-28 10:54:44.160: D/TEST(13577): Chupe de Carne 
06-28 10:54:44.160: D/TEST(13577): Ajiaco con Hamburguesa de Casa 
06-28 10:54:44.160: D/TEST(13577): Moron Get week 
06-28 10:54:44.160: D/TEST(13577): Trigo Guizado con Pollito al Horno Get week 
06-28 10:54:44.160: D/TEST(13577): 4 
06-28 10:54:44.160: D/TEST(13577): Moron 
06-28 10:54:44.160: D/TEST(13577): Trigo Guizado con Pollito al Horno 
06-28 10:54:44.160: D/TEST(13577): Crema de Verduras Get week 
06-28 10:54:44.160: D/TEST(13577): Picante de Carne Get week 
06-28 10:54:44.160: D/TEST(13577): 5 
06-28 10:54:44.160: D/TEST(13577): Crema de Verduras 
06-28 10:54:44.160: D/TEST(13577): Picante de Carne 
06-28 10:54:44.160: D/TEST(13577): Crema de Verduras 
06-28 10:54:44.160: D/TEST(13577): Picante de Carne weekdays 
06-28 10:54:44.160: D/TEST(13577): Crema de Verduras weekdays 
06-28 10:54:44.160: D/TEST(13577): Picante de Carne weekdays 
06-28 10:54:44.170: D/TEST(13577): Crema de Verduras weekdays 

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

Я действительно понятия не имею, почему это происходит, и я уже попытался изменить время цикла для петли для

+0

Просто имейте в виду, чтобы закрыть курсор! –

ответ

1

Сделано liitle рефакторинга сделай так, чтоб это работало. Просто взгляните на это:

Вы должны создать новый объект в каждом цикле, чтобы не изменять exsiting, которые находятся в вашем списке.

public ArrayList<String[]> getWeekUni() { 
    SQLiteDatabase db = helper.getWritableDatabase(); 

    String[] columns = { MenuDataBase.SOPA, MenuDataBase.FONDO1, 
      MenuDataBase.REFRESCO, MenuDataBase.CALORIAS, }; 

    ArrayList<String[]> weekdays = new ArrayList<String[]>(); 



    Cursor cursor = db.query(MenuDataBase.TABLE_UNI, columns, null, null, 
      null, null, null); 

    while (cursor.moveToNext()) { 
     // cursor.moveToNext(); //<-- You already did that one line above!!!! 
     String[] rowDay = new String[4]; //init here to create a new object and add it not to override existing object references!!! 

     int index1 = cursor.getColumnIndex(MenuDataBase.SOPA); 
     int index2 = cursor.getColumnIndex(MenuDataBase.FONDO1); 
     int index3 = cursor.getColumnIndex(MenuDataBase.REFRESCO); 
     int index4 = cursor.getColumnIndex(MenuDataBase.CALORIAS); 
     rowDay[0] = cursor.getString(index1); 
     rowDay[1] = cursor.getString(index2); 
     rowDay[2] = cursor.getString(index3); 
     rowDay[3] = cursor.getString(index4); 

     Log.d("TEST", rowDay[0]+" Get week"); 
      Log.d("TEST", rowDay[1]+" Get week"); 

     //int i = 0; 
     weekdays.add(rowDay); 

     Log.d("TEST",Integer.toString(weekdays.size())); 
     // not i to get last element, get last element with weekdays.size() - 1 
     Log.d("TEST", weekdays.get(weekdays.size() - 1)[0].toString()); 
     Log.d("TEST", weekdays.get(weekdays.size() - 1)[1].toString()); 
     // i++; 
    } 

    //To get All entries make it that way 
    for(String[] item : weekdays){ 
     Log.d("TEST", "" + item[0]); 
     Log.d("TEST", "" + item[1]); 
     Log.d("TEST", "" + item[2]); 
     Log.d("TEST", "" + item[3]); 
    } 

    cursor.close(); 
    db.close(); 

    return weekdays; 
} 
+0

Ну ... что сработало Можете ли вы объяснить, почему я не должен переопределять? Я мог бы знать ответ, но через несколько часов подумал о том, как исправить это, возможно, повредило мой мозг. Спасибо :) – user3610155

+0

Итак, у вас есть ссылка на rowDay в вашем ArrayList weekDays. В шаге nex Loop вы переопределяете точно такую ​​же ссылку из rowday, потому что все равно то же самое. Так что происходит, что все ссылки на этот выделенный объект rowDay обновляются! ArrayList не хранит копию rowDay, он сохраняет ссылку на объект. и вы манипулируете этим объектом в каждом цикле. Ты понял? –

+0

Oh shit ... Еще раз спасибо – user3610155

0

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

+0

Спасибо тоже :) – user3610155