2013-04-04 3 views
3

У меня есть метод, который возвращает массив объектов (класс отца всех классов в Java). Массив содержит 2 типов данных, как вы можете видеть objArray[0] is a int; и objArray[1] is a cursor;Как извлечь курсор и целочисленное значение из массива класса Object?

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

Технически это возможно, я думаю.

+0

класс матери –

+0

@ Алекс действительно классная? почему не класс отца –

+1

Используется для более старых версий. В Java 7 он все равно переименован в класс granpa, так что неважно –

ответ

4

Выглядит довольно просто. Посмотрите на ваше заявление:

objArray [0] - это int; и objArray [1] - это курсор;

, а затем код:

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

Вы относиться к ним навыворот - от objArray[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(), не так ли?

+0

высота моей неосторожности :) спасибо за такой замечательный ответ –

3

Вы смешиваете указатели, курсор находится в позиции 1, а int находится в позиции 0. Попробуйте это:

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

Вы видите, это точно какие проблемы, которые делают с использованием массива объектов со смешанными типами данных плохой идеей. Вам лучше создать новый класс («объект переноса») с атрибутами, которые вы хотите вернуть, и вернуть экземпляр этого класса.

3

Вы используете индексы другим способом. 0 для int и 1 для курсора.

Смежные вопросы