尝试访问String数组时收到ArrayIndexOutOfBoundsException

时间:2013-04-15 20:14:29

标签: android android-arrayadapter android-sqlite android-cursor

我有一个模型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;
}

2 个答案:

答案 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中的类名以大写字母开头。