3

オブジェクトの配列 (Java のすべてのクラスの親クラス) を返すメソッドがあります。objArray[0] is a int;ご覧のとおり、配列には 2 種類のデータが含まれています。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] は int です。objArray[1] はカーソルです。

そしてコード:

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

それらを間違った方法で扱っています- 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

インデックスを混合しています。カーソルは位置1にあり、int は位置にあり0ます。これを試して:

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

おわかりのように、これはまさに、混合データ型でオブジェクト配列を使用することを悪い考えにする種類の問題です。返したい属性を持つ新しいクラス (「転送オブジェクト」) を作成し、そのクラスのインスタンスを返すことをお勧めします。

于 2013-04-04T18:42:08.193 に答える