0

私は拡張する活動をしていますExpandableListActivity。Android 2.2 以降でアプリケーションを実行しても問題はありません。ただし、Android 2.1 エミュレーターで実行すると、このアクティビティ フォースは終了します (アプリの他のアクティビティには問題はありません)。私は完全に困惑しています。

ExpandableListView拡張する で使用するカスタム アダプターを作成しましたSimpleCursorTreeAdapter。次のコードを使用してリスト アダプターを設定しています。

customExpandableListAdapter = new BeerFlightsExpandableListAdapter(
                                    this,                                           // context
                                    beerFlights,                                    // cursor
                                    R.layout.beer_flight_list_item,                 // group layout
                                    new String[]{"_id", "name"},                    // group FROM
                                    new int[] {R.id.flight_id, R.id.flight_name},   // group TO
                                    R.layout.beer_flight_beer_list_item,            // child layout
                                    new String[]{"_id", "name"},                    // child FROM
                                    new int[]{R.id.beer_id, R.id.beer_name});       // child TO
setListAdapter(customExpandableListAdapter);

次のコードを使用してグループカーソルを取得しています。

String sql =
        "SELECT beer_flights._id, beer_flights.name, COUNT(beer_flight_beers.beer_id) AS beer_count"+
        " FROM beer_flight_beers"+
            " INNER JOIN beer_flights ON beer_flight_beers.beer_flight_id = beer_flights._id"+
            " INNER JOIN beer_locations ON beer_flights.location_id = beer_locations.location_id AND beer_locations.beer_id = beer_flight_beers.beer_id"+
        " WHERE beer_flights.location_id = ?"+
        " GROUP BY beer_flights._id"+
        " ORDER BY beer_flights.priority ASC";

Cursor cur = db.rawQuery(sql, new String[]{ locationId.toString() });

次のコードを使用してカーソルを取得しています。

String sql =
        "SELECT DISTINCT beers._id, beers.name, beers.brewery"+
        " FROM beer_flight_beers"+
            " INNER JOIN beers ON beer_flight_beers.beer_id = beers._id"+
            " INNER JOIN beer_flights ON beer_flight_beers.beer_flight_id = beer_flights._id"+
            " INNER JOIN beer_locations ON beer_flights.location_id = beer_locations.location_id AND beer_flight_beers.beer_id = beer_locations.beer_id"+
        " WHERE beer_flight_beers.beer_flight_id = ?"+
        " ORDER BY beers.name ASC";

Cursor cur = db.rawQuery(sql, new String[]{ flightId.toString() });

私が言ったように、これは Android 2.2+ のエミュレーターだけでなく、2.3.3 を実行している Droid 2 と 2.3.6 を実行している Droid 4 でも完全に機能します。ただし、Android 2.1 エミュレーターで同じコードを実行すると、次のエラーが発生します。

Uncaught handler: thread main exiting due to uncaught exception
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.absolutemg.jlbeers/com.absolutemg.jlbeers.BeerFlights}:
java.lang.IllegalArgumentException: column 'name' does not exist

[snip]

Caused by: java.lang.IllegalArgumentException: column 'name' does not exist
at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
at android.widget.SimpleCursorTreeAdapter.initFromColumns(SimpleCursorTreeAdapter.java:194)
at android.widget.SimpleCursorTreeAdapter.initGroupFromColumns(SimpleCursorTreeAdapter.java:200)
at android.widget.SimpleCursorTreeAdapter.init(SimpleCursorTreeAdapter.java:180)
at android.widget.SimpleCursorTreeAdapter.<init>(SimpleCursorTreeAdapter.java:169)
at com.absolutemg.jlbeers.BeerFlights$BeerFlightsExpandableListAdapter.<init>(BeerFlights.java:395)
at com.absolutemg.jlbeers.BeerFlights.onCreate(BeerFlights.java:100)

どちらのカーソルにも_idnameの列があります。そのため、なぜエラーが発生するのかわかりませんcolumn 'name' does not exist

カーソルを変更して、 flight_idflight_nameの列を返すように微調整し、それに応じてリスト アダプターを変更しました。私がやったとき、アクティビティはもはやクラッシュしませんでした。グループ名が表示されました。ただし、グループをクリックして開くと、再び強制的に閉じられました。

これらの同じ変更により、Android 2.2+ でアクティビティが強制的に閉じられました (カーソルに_idという名前の列がないためだと思います)。したがって、これは実際には修正ではありません。

rawQuery()カーソルや2.2 で変更された 2.1の機能に何か違いはありましたか? この問題を修正する方法については、ここで完全に途方に暮れています。

このアプリの Android 2.1 のサポートを取りやめたいと思っていますが、2.1 を実行しているユーザーもいます (ユーザー ベースの約 1.26% にすぎませんが、更新されたアプリから誰も除外したくありません)。

ここSOで見つけた他の質問はどれもこれとまったく同じではなく、他の場所で何かを見つけることができませんでした. 何か案は?

4

1 に答える 1

0

私は物事を修正することができました...投稿してからわずか数分です。そして、解決策は私をばかのように感じさせます。:(

次のように、カーソルのクエリを変更して、列名を明示的に設定しました。

グループカーソル

SELECT beer_flights._id AS _id, beer_flights.name AS name, COUNT(beer_flight_beers.beer_id) AS beer_count

子カーソル

SELECT DISTINCT beers._id AS _id, beers.name AS name, beers.brewery AS brewery

私がそれをした後、私がテストしているすべてのバージョンの Android で想定どおりにすべてが機能しました。

Android 2.1ではそれを行う必要があるのに、それ以降のバージョンでは必要ない理由を誰かが知っていますか? 私にはばかげているように思えますが、それが問題を修正しました。

おそらく、クエリの列の前にテーブル名が付けられているためです。それが現時点での私の唯一の推測です。

于 2012-08-10T16:26:43.530 に答える