3

我有一个返回对象数组的方法(Java 中所有类的父类)。如您所见objArray[0] is a int;,数组包含两种类型的数据objArray[1] is a cursor;

public Object[] search_record(String rollNo) {

    Object[] objArray = new Object[2];

    SQLiteDatabase db = this.getWritableDatabase();

    Cursor cur = db.rawQuery("SELECT * FROM " + TABLE_NAME
            + " where roll_no = ?", new String[] { rollNo });
    int count = cur.getCount();

    objArray[0] = count;
    objArray[1] = cur;

    Log.i("Records count", count + "");

    return objArray;

}

现在我无法将这些值提取回原始值i.e int and cursor。我得到这样的数组。

Object[] objArray = dbHelper.search_record("08cs18");
int x = ((Integer) objArray[1]).intValue();
Cursor cursor = (Cursor) objArray[0];

但应用程序崩溃classCastException

我认为从技术上讲这是可能的。

4

3 回答 3

4

对我来说看起来很简单。看你的说法:

objArray[0] 是一个整数;并且 objArray[1] 是一个游标;

然后是代码:

Object[] objArray = dbHelper.search_record("08cs18");
int x = ((Integer) objArray[1]).intValue();
Cursor cursor = (Cursor) objArray[0];

您以错误的方式对待它们- as ofobjArray[1]是整数,并且objArray[0]是光标。只需切换索引。

或者,最好......创建自己的类来封装“游标和计数”:

public final class CursorAndCount {
    private final int count;
    private final Cursor cursor;

    public CursorAndCount(int count, Cursor cursor) {
        this.count = count;
        this.cursor = cursor;
    }

    public int getCount() {
        return count;
    }

    public int getCursor() {
        return cursor;
    }
}

然后您可以更改search_record(应该调用searchRecord)以返回CursorAndCount- 并且调用代码将立即更具可读性。

请注意,既然您仍然从光标中获取计数,为什么不直接返回光标呢?调用者当然可以使用Cursor.getCount()自己,不是吗?

于 2013-04-04T18:42:18.417 回答
3

您正在混合索引,光标​​在 position1并且 int 在 position 0。试试这个:

int x = ((Integer) objArray[0]).intValue();
Cursor cursor = (Cursor) objArray[1];

你看,这正是使使用具有混合数据类型的对象数组成为一个坏主意的问题。您最好创建一个具有您想要返回的属性的新类(“传输对象”),并返回该类的一个实例。

于 2013-04-04T18:42:08.193 回答
3

您正在以其他方式使用索引。0 表示 int,1 表示光标。

于 2013-04-04T18:43:53.940 回答