1

我有一个模型,lineModel我用它来items为我的 gridAdapter 填充一个数组。当我手动填充条目时,我的模型工作正常。例如:

lineModel[] items = {
                new lineModel(2, "B", "", "#52D017", 5, 10, 30),
                new lineModel(3, "C", "", "#000000", 4, 8, 30),
};

items但是,当使用SQLite填充时,我会收到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;
}
4

2 回答 2

3

好吧,您正在创建一个长度为零的数组:

lineModel[] items = {};

所以items[i]当你尝试分配它时没有。

如果您可以使用c.getCount()Flavio Faria 建议的那样,请将初始长度设置为该值。否则,我建议您使用ArrayList,并在进行时使用.add()它的项目。您可以获得结果数组.toArray()

事实上,您可能会考虑使用 ArrayList 并将其作为返回值传递,这通常是一个好主意。

另一种选择——取决于你如何使用这些线模型项目——是传递一个迭代器而不是一个数组(因为你所做的本质上是迭代到一个数组中。

于 2013-04-15T20:16:50.077 回答
2

不能"*"与列名一起使用。您必须仅使用"*"或者必须声明数组中的每一列。所以,不要这样做:

String[] sqlSelect = {"0 _id", "*"}; 

改为添加它们中的每一个:

String[] sqlSelect = { "line_id", "line_name", "line_color", "text_color"}; 

或者:

String[] sqlSelect = { "*" }; 

您还必须删除c.moveToFirst()call 以避免跳过游标的第一行,因为c.moveToNext()已经为您完成了这项工作。

您的数组还必须足够大以容纳所有项目:

lineModel[] items = new lineModel[c.getCount()];

除此之外,请记住 Java 中的类名以大写字母开头。

于 2013-04-15T20:16:57.797 回答