字符串数组的Arraylist问题

时间:2014-06-28 16:06:06

标签: java android sqlite arraylist

我试图从Sqlite上的数据库中获取数据。 首先将行插入到String []中,然后将String []插入到一个arraylist中,最后返回arraylist以在其他类中使用它。

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

这里的问题是,在while循环结束后,工作日对象将它们的值设置为好像它们都是相同的,你可以在最后的日志中看到我显示

我真的不知道为什么会这样,我已经尝试更改for循环的for循环

2 个答案:

答案 0 :(得分:1)

进行一些重构以使其工作。看看吧:

您必须在每个循环上创建一个新对象,以便不更改列表中的现有对象。

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

答案 1 :(得分:0)

您需要在循环中创建字符串数组rowDay的新实例。目前,您正在重新使用该数组,因此先前的值会被覆盖(您继续将相同的数组添加到列表中,而不是每行添加一个新数组)