我试图从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循环
答案 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
的新实例。目前,您正在重新使用该数组,因此先前的值会被覆盖(您继续将相同的数组添加到列表中,而不是每行添加一个新数组)