我有一个模型lineModel
,我用它为我的gridAdapter填充数组items
。 当我手动填充条目时,我的模型正常工作。例如:
lineModel[] items = {
new lineModel(2, "B", "", "#52D017", 5, 10, 30),
new lineModel(3, "C", "", "#000000", 4, 8, 30),
};
但是,在使用 SQLite 填充items
时,我会收到ArrayIndexOutOfBoundsException
具体做法是:
04-15 15:50:21.322: E/AndroidRuntime(26804): java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
04-15 15:50:21.322: E/AndroidRuntime(26804): at com.idealiner.metrosleepuniversal.model.GridModel.getLines(GridModel.java:68)
第68行是我调用lineModel并使用游标中的值填充它。
items[i] = new lineModel(i, c.getString(c_line), c.getString(c_name), c.getString(c_ccolor), 0, 0, 0);
方法getLines()
应该返回对象数组,但在while()
循环中的某个地方我认为存在问题,很可能在填充数组时。
任何帮助/建议/指导将不胜感激。
整个方法getLines
如下:
public lineModel[] getLines() {
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String[] sqlSelect = {"*"};
String sqlTables = "lines";
qb.setTables(sqlTables);
Cursor c = qb.query(db, sqlSelect, null, null,
null, null, null);
lineModel[] items = {};
int i=0;
int c_line = c.getColumnIndex("line_id");
int c_name = c.getColumnIndex("line_name");
int c_ccolor = c.getColumnIndex("line_color");
int c_tcolor = c.getColumnIndex("text_color");
c.moveToFirst();
if (c != null) {
while(c.moveToNext()) {
items[i] = new lineModel(i, c.getString(c_line), c.getString(c_name), c.getString(c_ccolor), 0, 0, 0);
i++;
}
c.close();
}
return items;
}
答案 0 :(得分:3)
嗯,你正在创建一个零长度数组:
lineModel[] items = {};
所以当你尝试分配它时没有items[i]
。
如果您可以使用c.getCount()
,正如Flavio Faria建议的那样,请将初始长度设置为该值。否则,我建议你随身携带ArrayList和.add()
个项目。您可以使用.toArray()
事实上,您可能会考虑使用ArrayList并将其作为返回值传递,这通常是一个好主意。
另一种选择 - 取决于你如何使用这些线模型项 - 是传递一个Iterator而不是一个数组(因为你所做的实际上是迭代到一个数组。
答案 1 :(得分:2)
您不能将"*"
与列名一起使用。您必须只使用"*"
,或者必须声明数组中的每一列。所以,不要这样做:
String[] sqlSelect = {"0 _id", "*"};
改为添加每一个:
String[] sqlSelect = { "line_id", "line_name", "line_color", "text_color"};
或者:
String[] sqlSelect = { "*" };
您还必须删除c.moveToFirst()
调用,以避免跳过光标的第一行,因为c.moveToNext()
已经为您完成了这项工作。
您的阵列也必须足够大,以容纳您的所有物品:
lineModel[] items = new lineModel[c.getCount()];
除此之外,请记住Java中的类名以大写字母开头。